将JSON反序列化为通用映射,将所有JSON浮点数强制转换为Jackson中的Decimal或String

时间:2013-04-30 22:14:22

标签: java json numbers jackson deserialization

我在jsonrpc4j中使用Jackson来访问远程服务。在我的Java应用程序中,没有为返回值定义的类,因此反序列化会生成通用的LinkedHashMaps。所以我不能在任何地方添加任何注释。 jsonrpc4j可以接受Jackson ObjectMapper对象。 远程服务使用结构化的json对象进行响应,其中一些字段是非常大的十进制数,而Jackson将它们视为双打。 示例对象可能如下所示

{"s1":"zxcvb","f1":20.00234,"a1":[{"f2":3883.99400943},{"f3":0.00093944432}]}

我希望它将所有数字解释为具有可配置精度的字符串或小数,并根据这些类型正确解析它们。 是否可以使用修改后的ObjectMapper对象执行此操作? 如果不是这样,最简单的方法是什么?

1 个答案:

答案 0 :(得分:5)

我想我找到了: 在我第一次搜索时,我错过了Jackson序列化同时具有Seri​​alizationFeatures和DeserializationFeatures,它们有点不同。 根据{{​​3}},有一个名为USE_BIG_DECIMAL_FOR_FLOATS

的功能
  

如果只有泛型类型描述(Object或Number,或者在无类型Map或Collection上下文中)可用,则确定是否要将JSON浮点数反序列化为BigDecimals的功能。

所以在我的情况下它基本上是

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

JsonRpcHttpClient rpcHttpClient = new JsonRpcHttpClient(
    mapper,
    new URL("the url"),
    new HashMap<String, String>());