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

Cra*_*ray 2 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}]}
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*ray 5

我想我发现了:在我第一次搜索时,我错过了Jackson序列化同时具有Seri​​alizationFeatures和DeserializationFeatures,它们有点不同.根据http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/DeserializationFeature.html,有一个名为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>()); 
Run Code Online (Sandbox Code Playgroud)