2013-05-29 65 views
2

我正在使用喜歡製作輪子的Web服務。對於一系列對象,不是將數據存儲在JSON數組中,而是爲序列中的每個索引創建一個新節點。需要反序列化奇數Json結構的幫助

{ 
    "sequence": { 
     "0": { 
      "foo": "foo", 
      "bar": "bar", 
      "baz": "baz" 
     }, 
     "1": { 
      "foo": "foo", 
      "bar": "bar", 
      "baz": "baz" 
     }, 
     "2": { 
      "foo": "foo", 
      "bar": "bar", 
      "baz": "baz" 
     } 
    } 
} 

我想知道如果任何人有一個優雅的解決方案或理智的方式與傑克遜

public class SequenceElement { 
    String foo, bar, baz; 
    // Getters and setters below 
} 

反序列化到序列豆的數組或集合這與作爲JsonNode是最好的東西的順序工作我可以拿出atm,這裏有一些未經測試的sudo代碼。

ObjectMapper objectMapper = new ObjectMapper();  

@JsonProperty("sequence") 
public void setSequence(JsonNode sequence) { 
    List<SequenceElement> list = new ArrayList<SequenceElement>(); 

    int i = 0; 
    while(sequence.get(String.valueOf(i)) != null) { 
     JsonNode element = sequence.get(String.valueOf(i)); 
     list.add(objectMapper.readValue(element, SequenceElement.class); 
     i += 1; 
    } 

    this.sequence = list; 
} 
+0

+1對於重新發明輪子的扭曲:)至於解決方案,我認爲你最好的選擇是將它讀入一個通用的json對象並將其轉換爲序列。 –

+0

通用json是什麼意思?你是在談論把它作爲一個字符串存儲並在後面處理它? – Dan

+0

不,我認爲引用的是一個樹,比如'JsonNode root = mapper.readAsTree(source);',然後訪問部分。 – StaxMan

回答

2

爲了擴大對@ SubirKumarSao是已經正確答案,這裏是一個辦法讓你的序列項目的列表,以相同的順序由數據指標爲保證:

數據類

public class Sequence { 
    private String foo; 
    private String bar; 
    private String baz; 

    // Constructors, getters/setters 

    @Override 
    public String toString() { 
     return String.format("Sequence[foo=%s, bar=%s, baz=%s]", getFoo(), 
       getBar(), getBaz()); 
    } 
} 

class SequenceHolder { 
    private Map<Integer, Sequence> sequence; 

    public SequenceHolder() { 
     sequence = new TreeMap<Integer, Sequence>(); 
    } 

    // Other constructors, getters/setters 
} 

主邏輯

final String json = "JSON HERE"; 

final SequenceHolder holder = new ObjectMapper().readValue(json, 
     SequenceHolder.class); 
System.out.println(holder.getSequence().values()); 

測試本變形您的JSON的版本(以說明排序):

{ 
    "sequence": { 
     "0": { 
      "foo": "foo0", 
      "bar": "bar0", 
      "baz": "baz0" 
     }, 
     "1": { 
      "foo": "foo1", 
      "bar": "bar1", 
      "baz": "baz1" 
     }, 
     "2": { 
      "foo": "foo2", 
      "bar": "bar2", 
      "baz": "baz2" 
     } 
    } 
} 

輸出

[序列[富= foo0,棒= BAR0,巴茲= baz0],序列[富= foo1,巴= BAR1,巴茲= baz1],序列[富= foo2的,酒吧= BAR2,巴茲= baz2]

正如你所看到的,你得到的物品的列表,在相同的順序將保證您的數據索引(關鍵是使用樹形圖)。

3

IMO Map<String,Sequence>應該是JSON對象的Java等價物。

+0

是的。甚至「Map 」也可以通過隱式強制工作。 – StaxMan