ObjectMapper读取转义字符

当使用ObjectMapper的readValue方法从JSON字符串转换对象时,遇到非标准的JSON字符如控制字符、单引号、反斜杠等会导致解析异常。通过配置ObjectMapper的Feature.ALLOW_UNQUOTED_CONTROL_CHARS为true,可以允许未引号的控制字符,从而解决此类问题。同时,文中还提到了其他如ALLOW_SINGLE_QUOTES、ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER和STRICT_DUPLICATE_DETECTION等配置项及其影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Form转为json字符串后,后台ObjectMapper.readValue(String json, Class<T> valueType):读取json转为Object或Array 时,其间:json中可能含有非标准JSON的字符,如:tab、换行符、结束语符、注释符等控制字符。这样读取时,会抛出异常。字符可分为:控制字符(ASCII码<32的字符)、可显示字符。ASCII码对照表参考:http://tools.jb51.net/table/ascii

       解决方法:ObjectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true)。Feature是个枚举类,枚举出JSON可能出现的特殊字符。以下是对Feature的源码理解:

package jackson.parser;

/**
 * jackson的ObjectMapper读取json中的转义字符<br>
 * 注意问题:<br>
 * 1.Feature是com.fasterxml.jackson.core.JsonParser的内部类<br>
 * 2.JSON的标准格式:http://www.json.org/
 * @author TCM
 * @create 2017年3月30日下午4:16:06
 */
public class JackJsonESC {
	
    /**
     * 枚举类定义所有开/关的解析器
     * Enumeration that defines all on/off features for parsers.
     */
    public enum Feature {
        
        // // // Low-level I/O handling features:支持低级I/O操作特性
        
        /**
         * 自动关闭源:默认true_启用(即:解析json字符串后,自动关闭输入流)<br>
         * 该特性,决定了解析器是否可以自动关闭非自身的底层输入源<br>
         * 1.禁用:应用程序将分开关闭底层的{@link InputStream} and {@link Reader}<br>
         * 2.启用:解析器将关闭上述对象,其自身也关闭,此时input终止且调用{@link JsonParser#close}<br>
         */
        AUTO_CLOSE_SOURCE(true),
            
        // // // Support for non-standard data format constructs:支持非标准数据格式的json

        /**
         * 默认false:不解析含有注释符(即:true时解析含有注释的json字符串)<br>
         * 该特性,决定了解析器是否可以解析含有Java/C++注释样式(如:/*或//的注释符)<br>
         * 注意:标准的json字符串格式没有含有注释符(非标准),然而则经常使用<br>
         */
        ALLOW_COMMENTS(false),

        /**
         * 默认false:不解析含有另外注释符<br>
         * 该特性,决定了解析器是否可以解析含有以"#"开头并直到一行结束的注释样式(这样的注释风格通常也用在脚本语言中)<br>
         * 注意:标准的json字符串格式没有含有注释符(非标准),然而则经常使用<br>
         */
        ALLOW_YAML_COMMENTS(false),
        
        /**
         * 默认false:不解析含有结束语的字符<br>
         * 该特性,决定了解析器是否可以解析该字符(结束语字段符,一般在js中出现)<br>
         * 注意:标准的json字符串格式没有含有注释符(非标准),然而则经常使用<br>
         */
        ALLOW_UNQUOTED_FIELD_NAMES(false),

        /**
         * 默认false:不解析含有单引号的字符串或字符<br>
         * 该特性,决定了解析器是否可以解析单引号的字符串或字符(如:单引号的字符串,单引号'\'')<br>
         * 注意:可作为其他可接受的标记,但不是JSON的规范<br>
         */
        ALLOW_SINGLE_QUOTES(false),

        /**
         * 允许:默认false_不解析含有结束语控制字符<br>
         * 该特性,决定了解析器是否可以解析结束语控制字符(如:ASCII<32,如包含tab或换行符)<br>
         * 注意:设置false(默认)时,若解析则抛出异常;若true时,则用引号即可转义<br>
         */
        ALLOW_UNQUOTED_CONTROL_CHARS(false),

        /**
         * 可解析反斜杠引用的所有字符,默认:false,不可解析
         */
        ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),

        /**
         * 可解析以"0"为开头的数字(如: 000001),解析时则忽略0,默认:false,不可解析,若有则抛出异常
         */
        ALLOW_NUMERIC_LEADING_ZEROS(false),
        
        /**
         * 可解析非数值的数值格式(如:正无穷大,负无穷大,除以0等其他类似数据格式和xml的标签等)
         * 默认:false,不能解析
         */
         ALLOW_NON_NUMERIC_NUMBERS(false),

         /**
          * 默认:false,不检测JSON对象重复的字段名,即:相同字段名都要解析
          * true时,检测是否有重复字段名,若有,则抛出异常{@link JsonParseException}
          * 注意:检查时,解析性能下降,时间超过一般情况的20-30%
          */
         STRICT_DUPLICATE_DETECTION(false),

         /**
          * 默认:false,底层的数据流(二进制数据持久化,如:图片,视频等)全部被output,若读取一个位置的字段,则抛出异常
          * true时,则忽略未定义
          */
         IGNORE_UNDEFINED(false),

         /**
          * 默认:false,JSON数组中不解析漏掉的值,若有,则会抛出异常{@link JsonToken#VALUE_NULL}
          * true时,可解析["value1",,"value3",]最终为["value1", null, "value3", null]空值作为null
          */
         ALLOW_MISSING_VALUES(false)
         ;

        /**
         * Whether feature is enabled or disabled by default.
         */
        private final boolean _defaultState;

        private final int _mask;
        
        /**
         * Method that calculates bit set (flags) of all features that
         * are enabled by default.
         */
        public static int collectDefaults()
        {
            int flags = 0;
            for (Feature f : values()) {
                if (f.enabledByDefault()) {
                    flags |= f.getMask();
                }
            }
            return flags;
        }

        private Feature(boolean defaultState) {
            _mask = (1 << ordinal());
            _defaultState = defaultState;
        }

        public boolean enabledByDefault() { return _defaultState; }

        /**
         * @since 2.3
         */
        public boolean enabledIn(int flags) { return (flags & _mask) != 0; }

        public int getMask() { return _mask; }
    }




}


可能出现的错误:

ALLOW_UNQUOTED_CONTROL_CHARS(false),:带有换行符
Caused by: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in string value
 at [Source: {"id":"2c908f955ac6a8d7015ac6cb419e000c","createDate":"2017-03-30 16:52:41","title":"平台交流群1","text":"QQ:012345678
微信:xxxxxx"}; line: 1, column: 115]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1586)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:521)


ALLOW_SINGLE_QUOTES(false),:含有单引号,为true时,则:'\''保存为'''
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape ''' (code 39)
 at [Source: {"id":"2c908f955ac6a8d7015ac6cb419e000c","createDate":"2017-03-31 09:11:08","title":"平台交流群1","text":"'\''"}; line: 1, column: 105]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1586)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:521)


ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),:含有反斜杠的转义字符,为true时,则:\'保存为’
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape ''' (code 39)
 at [Source: {"id":"2c908f955ac6a8d7015ac6cb419e000c","createDate":"2017-03-31 09:20:33","title":"平台交流群1","text":"\'"}; line: 1, column: 104]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1586)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:521)


STRICT_DUPLICATE_DETECTION(false),:默认:false,不检查重复的key值,true时,检查是否有重复的key值,若有则报错:
com.fasterxml.jackson.core.JsonParseException: Duplicate field 'text'
 at [Source: {"id":"2c908f955ac6a8d7015ac6cb419e000c","createDate":"2017-03-31 10:16:15","title":"平台交流群1","text":"你好2","text":"你好2"}; line: 1, column: 113]
at com.fasterxml.jackson.core.json.JsonReadContext._checkDup(JsonReadContext.java:204)
at com.fasterxml.jackson.core.json.JsonReadContext.setCurrentName(JsonReadContext.java:198)



附带:JSON含有的特殊字符









       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值