2015-01-07 107 views
2

嗨我正在使用jackson轉換爲json以用於我的api項目。我已經使用的依賴性是使用jackson jersey將複雜哈希映射轉換爲JSON

 <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
      <version>2.4.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.13</version> 
     </dependency> 

我有兩個類

TimeInterval所和成本

我需要創建一個地圖

Map<TimeInterval, Cost> 

這將使用傑克遜被轉換爲JSON供應商。

它轉換它很好,但我得到的關鍵是toString作爲字符串而不是json對象。

任何幫助表示讚賞。

感謝 Sanjeev

+0

因此TimeInterval的屬性是關鍵字,Cost是結果Hashmap中的值 –

+0

@naresh kumar yes。 – SanjeevGhimire

+0

將一些複雜對象作爲映射關鍵字是一種不好的做法。 –

回答

1

你能否解釋一下? JSON本質上是一個關鍵字,值對是字符串或值是數組,docuemnt,但是這又會在字符串級別。

+0

更具體地說,JSON鍵是ALWAYS字符串,不能是其他任何東西;而值可以是任何有效的JSON值類型,包括Object,Array,String,Number,Boolean或'null'。 – StaxMan

1

好這兩個類轉換成HashMap中像

Map<String,Object> map_values = mapper.convertValue(Object(TimeInterval/Cost), Map.class); 

,並根據您的要求建立第三HashMap中。

0

JSON是一個簡單的文本數據表示,下面的頁面實際上在一個簡短的HTML頁面中定義了JSON語法http://json.org/

正如您所看到的基礎構建塊是對象和數組以及一些數據類型(字符串數字布爾值和空值)。

如果你需要一個哈希映射,你可以採取這樣一個事實,即基本對象成員有些字典中鍵必須是字符串,值是和對象(或者是一個數組,以防止相同的時間間隔費用)。

所以現在你需要提供你自己的業務邏輯來爲你的TimeInterval提供一個唯一的字符串表示,它可以解析回使用json的代碼上的對象。

比方說,例如,通過分離的TimeInterval所開始和結束的時間價值「 - 」

E,G。你的時間的toString TimeInterval所會像

@Override 
public String toString() { 
    //start and end are of type Date 
    return start.getTime()+"-"+end.getTime(); 
} 

現在生成的JSON的樣子

{ 
    "1420667419892-1420698059892" : { 
     "ammount" : 10.9, 
     "currency" : "USD" 
    }, 
    "1420698059892-1420706699892" : { 
     "ammount" : 10.9, 
     "currency" : "ERO" 
    } 
} 

但如果是TimeInterval所更加複雜,上面的選項是不可能的。您將需要TimeInterval所一些代理鍵,那麼你必須創建結束語對象,將包括你字典和一組或現有IntervalIdToCost

public class TimeToCostMapWarpper { 
    //Map TimeInterval.Id to Cost 
    Map<String, Cost> intervalIdToCost = new HashMap<>(); 
    Set<TimeInterval> timeIntervals = new HashSet<>(); 
//getter/setter... 
} 

現在你會序列化包裝對象,並會得到類似:

{ 
    "intervalIdToCost" : { 
     "1f3fe6cf-7afe-4575-b8b2-bbe2067a99bd" : { 
      "ammount" : 10.9, 
      "currency" : "ERO" 
     }, 
     "d2c880ce-ef41-48f8-8f4a-0ff73449e1c3" : { 
      "ammount" : 10.9, 
      "currency" : "USD" 
     } 
    }, 
    "timeIntervals" : [{ 
      "id" : "1f3fe6cf-7afe-4575-b8b2-bbe2067a99bd", 
      "start" : 1420702028475, 
      "end" : 1420710668475 
     }, { 
      "id" : "d2c880ce-ef41-48f8-8f4a-0ff73449e1c3", 
      "start" : 1420693388475, 
      "end" : 1420702028475 
     } 
    ] 
} 

我想你可以想到其他的實現這一點,只需要記住,輸出應該包含足夠的數據來解析消費方面的結果。

+0

請注意,上面的第一個對象是無效的,因爲它有兩個相同的鍵。另外,如果有一個鍵是「變量」的JSON對象是不明智的。最好有一個對象數組,其中「可變」數量是每個對象中鍵/值對的值部分。 (這基本上是你在第二個例子中用「timeIntervals」結構做的。) –

+0

我同意,但我想這取決於你的需求和偏好, –