2

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

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

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

4

1 回答 1

5

我想我找到了:在我的第一次搜索中,我错过了 Jackson 序列化同时具有 SerializationFeatures 和 DeserializationFeatures,而且它们有点不同。根据http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/DeserializationFeature.html有一个名为 USE_BIG_DECIMAL_FOR_FLOATS 的功能

如果只有泛型类型描述(对象或数字,或在无类型映射或集合上下文中)可用,则确定是否将 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>()); 
于 2013-05-01T19:54:14.177 回答