2013-04-30 98 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

相關問題