2013-04-30 330 views
2

我在jsonrpc4j中使用Jackson来访问远程服务。在我的Java应用程序中没有为返回值定义的类,因此反序列化会生成通用的LinkedHashMaps。所以我不能在任何地方添加注释。 jsonrpc4j可以接受Jackson ObjectMapper对象。 远程服务使用结构化的json对象进行响应,其中一些字段是非常大的十进制数,Jackson将它们视为双精度对象。 一个例子对象可以是这样的将JSON反序列化为通用映射,强制所有JSON浮点数转换为Decimal或String,在Jackson中

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

我想它,而不是解释所有的数字作为字符串或小数的配置精度,并根据这些类型正确地分析它们。 使用修改的ObjectMapper对象可以做到这一点吗? 如果没有,那么最简单的方法是什么?

+0

你有什么代码这么远? – Chris 2013-04-30 22:15:42

+0

它基本上只是来自http://code.google.com/p/jsonrpc4j/用于Jsonrpc客户端的示例代码,我甚至不知道从哪里开始尝试,因为ObjectMapper类似乎没有任何配置选项,或者明显的覆盖方法很容易实现。 – Cray 2013-04-30 22:18:36

+0

看看mixin注释。他们会为你工作吗? http://wiki.fasterxml.com/JacksonMixInAnnotations?highlight=%28%28JacksonAnnotations%29%29 – 2013-04-30 22:20:30

回答

5

我想我找到了它: 在我第一次搜索时,我错过了杰克逊的序列化具有Seri​​alizationFeatures和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>()); 
+0

谢谢你的工作,因为它现在救了我:) – 2rs2ts 2014-12-11 01:52:09

相关问题