2014年1月27日星期一

贰零壹叁 - 那一缕阳光

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
贰零壹叁 - 那一缕阳光  阅读原文»

转眼间,2013年已渐渐逝去,回首2013,是我的一个转折点。 2013年,是我走出校园,走进社会,踏上工作岗位的第一年。这一年,使我对人生、对社会的看法产生了极大的变化。以往,我以为人生是美丽而丰富多彩的,社会上的每个人都是是和谐、天天向上的,然而,当我涉足社会的第一年,让我感到,社会并不像自己想...

json解析之jackson ObjectMapper - treerain  阅读原文»

Json解析常用的有fastjson和jackson,性能上网上有不少的对比,说是fastjson比较好,今天先整理一下jackson的东西,后面再发一个fastjson的。

jackson是spring mvc内置的json转换工具,fastjson则是阿里做的开源工具包。

jackson序列化如下:

1 /**
2 * json serialize
3 * @param obj
4 * @return
5 */
6 public static String jsonSerialize(final Object obj) {
7 ObjectMapper om = new ObjectMapper();
8 try {
9 return om.writeValueAsString(obj);
10 } catch (Exception ex) {
11 return null;
12 }
13 }

jackson反序列化如下:

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 return om.readValue(json, mapClazz);
11 } catch (Exception ex) {
12 return null;
13 }
14 }

在使用的过程中,很有可能会遇到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方法可以在每一个未知属性上调用一次。

这个方法在你想要添加一个未知属性处理日志的时候非常有用:当属性不确定的时候,不会引起一个绑定属性的错误。


本文链接:http://www.cnblogs.com/treerain/p/JacksonHowToIgnoreUnknow.html,转载请注明。

阅读更多内容

没有评论:

发表评论