一 JACKSON 序列化相关
1 JACKSON序列化问题解决
最近使用了jackson json来格式化数据输出,但是反序列化生成对象的时候碰到点麻烦,jackson把数据默认解析成了Map对象,
经查询文档,问题解决,在ObjectMapper的readvalue方法中按Object所使用的类型声明即可,代码如下:
Map<Integer, RbtCounter> srcMap = new LinkedHashMap();
Map<Integer, RbtCounter> destMap;
String jsonData = mapper.writeValueAsString(srcMap);
正确:
destMap = mapper.readValue(jsonData, new TypeReference<Map<Integer, RbtCounter>>(){}); // 反序列化
TypeReference -- 让Jackson Json在List/Map中识别自己的Object
错误
destMap = mapper.readValue(jsonData, LinkedHashMap.class); List中的自定义Object同理解决。
2 未知属性异常
在使用的过程中,很有可能会遇到json反序列化的问题。当你对象中有get***()的地方,它就当做它是一个属性,所以当你序列化json之后,在反序列化的时候,很有可能会出现异常的情况,因为在你的model中没有这个***的定义。
那该如何处理和解决呢?
jackson给出了它自己的解决方案(JacksonHowToIgnoreUnknow):
1. 在class上添加忽略未知属性的声明:@JsonIgnoreProperties(ignoreUnknown=true)
2. 在反序列化中添加忽略未知属性解析,如下:
1 /** 2 * json deserialize 3 * @param json 4 * @param mapClazz 5 * @return 6 */ 7 public static Object jsonDeserialize(final String json, final Class<?> mapClazz) { 8 ObjectMapper om = new ObjectMapper(); 9 try { 10 // 忽略未知属性 11 om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 12 return om.readValue(json, mapClazz); 13 } catch (Exception ex) { 14 return null; 15 } 16 }
3. 添加"Any setter"来处理未知属性
1 // note: name does not matter; never auto-detected, need to annotate 2 // (also note that formal argument type #1 must be "String"; second one is usually 3 // "Object", but can be something else -- as long as JSON can be bound to that type) 4 @JsonAnySetter 5 public void handleUnknown(String key, Object value) { 6 // do something: put to a Map; log a warning, whatever 7 }
4. 注册问题处理句柄
注册一个DeserializationProblemHandler句柄,来调用ObjectMapper.addHandler()。当添加的时候,句柄的handleUnknownProperty方法可以在每一个未知属性上调用一次。
这个方法在你想要添加一个未知属性处理日志的时候非常有用:当属性不确定的时候,不会引起一个绑定属性的错误
demo 1
第一种:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
JsonToJavaBean {
public
static
void
main(String[] args) {
String str=
"{\"student\":[{\"name\":\"leilei\",\"age\":23},{\"name\":\"leilei02\",\"age\":23}]}"
;
Student stu =
null
;
List<Student> list =
null
;
try
{
ObjectMapper objectMapper=
new
ObjectMapper();
StudentList studentList=objectMapper.readValue(str, StudentList.
class
);
list=studentList.getStudent();
}
catch
(Exception e) {
// TODO Auto-generated catch block
|