ObjectMapper读取转义字符

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)









  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值