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)