ObjectMapper读取转义字符

Form转为json字符串后,后台ObjectMapper.readValue(String json, Class 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中的转义字符
* 注意问题:
* 1.Feature是com.fasterxml.jackson.core.JsonParser的内部类
* 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字符串后,自动关闭输入流)
* 该特性,决定了解析器是否可以自动关闭非自身的底层输入源
* 1.禁用:应用程序将分开关闭底层的{@link InputStream} and {@link Reader}
* 2.启用:解析器将关闭上述对象,其自身也关闭,此时input终止且调用{@link JsonParser#close}
*/ AUTO_CLOSE_SOURCE(true), // // // Support for non-standard data format constructs:支持非标准数据格式的json /** * 默认false:不解析含有注释符(即:true时解析含有注释的json字符串)
* 该特性,决定了解析器是否可以解析含有Java/C++注释样式(如:/*或//的注释符)
* 注意:标准的json字符串格式没有含有注释符(非标准),然而则经常使用
*/ ALLOW_COMMENTS(false), /** * 默认false:不解析含有另外注释符
* 该特性,决定了解析器是否可以解析含有以"#"开头并直到一行结束的注释样式(这样的注释风格通常也用在脚本语言中)
* 注意:标准的json字符串格式没有含有注释符(非标准),然而则经常使用
*/ ALLOW_YAML_COMMENTS(false), /** * 默认false:不解析含有结束语的字符
* 该特性,决定了解析器是否可以解析该字符(结束语字段符,一般在js中出现)
* 注意:标准的json字符串格式没有含有注释符(非标准),然而则经常使用
*/ ALLOW_UNQUOTED_FIELD_NAMES(false), /** * 默认false:不解析含有单引号的字符串或字符
* 该特性,决定了解析器是否可以解析单引号的字符串或字符(如:单引号的字符串,单引号'\'')
* 注意:可作为其他可接受的标记,但不是JSON的规范
*/ ALLOW_SINGLE_QUOTES(false), /** * 允许:默认false_不解析含有结束语控制字符
* 该特性,决定了解析器是否可以解析结束语控制字符(如:ASCII<32,如包含tab或换行符)
* 注意:设置false(默认)时,若解析则抛出异常;若true时,则用引号即可转义
*/ 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)