使用Jackson JSON处理器而不使用注释

时间:2011-02-07 10:06:37

标签: android json jackson

我有一个包含xsd文件的软件包,用于生成(通过JAXB)与我们的服务器和客户端应用程序相关的共享类。所以这些类包含XML注释。

一个客户端是Android应用程序。我还想在这里使用这些类进行JSON反序列化,因为我与提供JSON的REST服务进行通信(使用Jersey / Jackson)。

我尝试在Android上使用Jackson(版本1.7.2),如下所示:

ObjectMapper mapper = new ObjectMapper();
mapper = mapper.configure(DeserializationConfig.Feature.USE_ANNOTATIONS,
                false);
mapper = mapper.configure(SerializationConfig.Feature.USE_ANNOTATIONS,
                false);
FooBar someObject = (FooBar) mapper.readValue(jsonString, FooBar.class);

我虽然配置MAPPER应该避免使用注释但我仍然得到

02-07 09:30:18.631: ERROR/AndroidRuntime(447): java.lang.NoClassDefFoundError: javax.xml.bind.annotation.XmlAccessorType
02-07 09:30:18.631: ERROR/AndroidRuntime(447):     at java.lang.Class.getDeclaredAnnotations(Native Method)
02-07 09:30:18.631: ERROR/AndroidRuntime(447):     at org.codehaus.jackson.map.introspect.AnnotatedClass.resolveClassAnnotations(AnnotatedClass.java:292)
02-07 09:30:18.631: ERROR/AndroidRuntime(447):     at org.codehaus.jackson.map.introspect.AnnotatedClass.construct(AnnotatedClass.java:139)

谁知道阻止杰克逊解决注释的伎俩。

由于   克劳斯

2 个答案:

答案 0 :(得分:2)

我目前的调查导致了这些结果:

使用DeserializationConfig.Feature.USE_ANNOTATIONS属性(设置为false)将导致JACKSON DeserializerConfig类使用NopAnnotationIntrospector。然后使用此NopAnnotationIntrospector解析类的注释。对于类的任何注释,NopAnnotationIntrospector将在每个false请求上返回isHandled - 事实上,在进一步处理中不会使用此注释。

所以 - 系统仍然“检查”注释 - 在这种情况下必须在Classpath上。由于Android不提供任何jaxb-api注释,因此会导致NoClassDefFoundError

我预计USE_ANNOTATIONS = false会让JACKSON完全忽略任何注释 - 但不幸的是它没有。我现在将使用Jackson Streaming API来解析JSON字符串,而不是使用JACKSON数据绑定功能。

答案 1 :(得分:0)

对于它的价值,Jackson trunk(1.8.0之前版本)的代码更改将尝试完全禁用注释处理;从理论上讲,这应该可以解决问题。 一个不幸的是,这个问题不会发生在常规J2SE JVM上,而只会发生在Android上;所以修复需要在Android上验证。因此,让Android开发人员验证修复是否完全解决问题(如果没有,需要做更多工作)会很好。