我面临以下问题。当杰克逊序列化器被传递一个包装原语进行序列化时,这个原语被序列化,例如:
objectMapper = new ObjectMapper();
StringWriter w = new StringWriter();
objectMapper.writeValue(w, Integer.valueOf(10));
System.out.println(w.toString());
10
作为输出产生。然而10
,它不是一个有效的 JSON(根据jsonlint),应该用方括号([10]
,因此它将是一个单元素数组)或花括号({value:10}
,因此它将是一个具有虚拟属性的对象)。该问题影响数字,, java.lang.String
, java.util.Date
...
我的问题是:如何让杰克逊执行包装?杰克逊不应该总是产生一个有效的 JSON 吗?
我已经分析了SerializationConfig.Feature.WRAP_ROOT_VALUE
启用启用的杰克逊行为:它没有按我预期的那样工作。原语现在被序列化为有效的 JSON ( {"Integer":10}
),但“普通”Java bean 也被包装,这是不受欢迎的({"MyBean":{"field":value, ...}}
而不是{"field":value, ...}
)。
如果有人可以建议如何自定义杰克逊,也许使用自定义序列化程序。困难在于必须区分根原始包装器(需要包装)和 bean 原始属性(不需要包装)。
为了使故事更完整:Jackson 序列化器用作 Spring MVC 的消息转换器,我怀疑编写一个挂钩来拦截原语的序列化是否相当容易(它不会调用 Jackson,但会"[" + String.toString(obj) + "]"
在必要时简单地返回)。所以我更喜欢调谐杰克逊的解决方案。