2013-05-13 79 views
2

我正在學習我的第一個Java Json解析器librairie,她是Jackson JSON。如何使用Jackson JSON將K/V的json數組轉換爲Java HashMap

我試圖轉換爲一個Java對象的ID/NOTE列表到一個HashMap列表。

的json輸入這個樣子

var basketList = [ 
{ 
    "name": "Basket 1", 
    "productList": { 
     //Id Item to incremente for ordering 
     "14":{ 
      // quantity to be add to this Id 
      "quantity":6, 
      "note": "Thing" 
     }, 
     "15":{ 
      "quantity":4, 
      "note": "Another Thing" 
     }, 

    } 
}, 
{ 
    "name": "Basket 2", 
    "productList": { 
     "14":{ 
      "quantity": 16, 
      "note": "Thing" 
     }, 
     "15":{ 
      "quantity":2, 
      "note": "Another Thing" 
     }, 
     "17":{ 
      "quantity":7, 
      "note": "Some Thing" 
     } 
    } 
} 

]

我的產品名單是動態的,我不希望創建一個Java對象,

我的第一個想法是在java中構建一個新的productList並將每個數量添加到正確的產品ID。

我找不到任何例子在線上如何做到這一點,我想用ObjectMapper()。readTree(),並與JsonNode

我不能讓它工作,任何幫助將理解

我已經這樣做了,但我卡在如何讓我的最後JsonNode的鍵名:

String JSON = myJavaItem.getJson(); 
JsonNode JavaItem = mapper.readTree(JSON); 
List<Product> listIwantCreate = BuildATestOrderList(JavaItem); 

public static List<Product> BuildATestOrderList(JsonNode node) 
{ 
    List<Product> productList = new ArrayList<Product>(); 
    JsonNode cabinetList = node.path("cabinet"); 
    if (!cabinetList.isMissingNode()) 
    { 
     for (JsonNode cabinet : cabinetList) 
     { 
      JsonNode basketList= cabinet.path("basketList"); 
      if (!basketList.isMissingNode()) 
      { 
       for (JsonNode item : productList) 
       { 
        // I need to populate here 
        Integer idItem; // how to get the key of current item ? 
        Integer qtity = item.path("quantity").getIntValue(); 
        Product p = new Product(); 
        p.setIdItem(idItem); 
        p.setQuantity(qtity); 
        productList.add(p); 
       } 
      } 
     } 

    } 
    return productList ; 
} 
+0

您的代碼不編譯。第二個foreach在'productList'上,它是'Product'而不是'JsonNode'的列表。此外,你的json不包含「內閣」領域,所以你的例子將無法正常工作。 – 2013-05-14 15:08:32

回答

3

你所尋找的是該方法的JsonNodefields()

for (Iterator<Entry<String, JsonNode>> iterator = basketList.fields(); iterator.hasNext();) { 
    Entry<String, JsonNode> item = iterator.next(); 
    Integer idItem = Integer.parseInt(item.getKey()); 
    // snip 
} 
+0

謝謝,實際上我自己找到了解決方案,忘記在這裏發佈它,這裏是我所做的,看起來類似於你的回答 Iterator > iterator = materialList.getFields(); – BigDong 2013-05-22 14:28:57

+1

令人驚訝的是如何使用'getFields'方法枚舉鍵的這種信息很難找到:( – chakrit 2013-10-07 05:44:18

1

可以使用傑克遜映射TypeFactory一個代碼這樣的事情。 。

objectMapper.readValue(yourJsonString, TypeFactory.mapType(Map.class, String.class, TypeFactory.collectionType(List.class, Product.class)); 

假設您的Product看起來像這樣。

class Product { 

    int quantity; 
    String note; 
    //getter - setter 

} 
+0

我是否必須爲此創建一些Java類?* – BigDong 2013-05-13 09:03:05

+0

是的..您必須從您的json看起來像value是產品對象列表 – sanbhat 2013-05-13 09:08:19

+0

我有一個產品類看起來像這樣,但我的最終列表產品不能有兩次相同的ID。我用一些java代碼更新了我的問題,希望我的問題會更容易理解 – BigDong 2013-05-13 09:15:08