2011-11-18 136 views
0

我有一個包含一陣列的輸入JSON對象如下所示:傑克遜arraynode

[{"key11":"value11","key12":"value12"}, 
{"key21":"value21","key22":"value22"}, 
... 
{"keyn1":"valuen1","keyn2":"valuen2"}] 

我想用傑克遜解析器中,首先,以確定的行數和第二,僅打印的值上屏幕。我希望它儘可能輕。任何人都可以指出我的方向?

回答

1

識別行

什麼是 「行」 的數量?鍵/值對是否是一排?是JSON數組的一個元素(不管它包含多少個鍵/值對)一行?

只打印屏幕

傑克遜無關與打印在任何屏幕上的任何值。 Jackson可以用來從輸入JSON填充Java數據結構,然後可以使用填充的Java數據結構。

鑑於原始問題中的JSON結構,一個簡單的解決方案是將綁定到地圖列表(或數組),然後只遍歷地圖列表,訪問所有值。以下就是這樣一個例子。

import java.io.File; 
import java.util.Map; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper(); 
    Map<String, String>[] maps = mapper.readValue(new File("input.json"), Map[].class); 
    for (Map<String, String> map : maps) 
    { 
     for (Map.Entry<String, String> entry : map.entrySet()) 
     { 
     System.out.println(entry.getValue()); 
     } 
    } 
    } 
} 

輸出:

value11 
value12 
value21 
value22 
valuen1 
valuen2 
1

假設一個row處於ArrayNode條目下面簡單的方法可能是有用的一個。它使用JsonNode抽象而不是一系列嵌套的Map對象,我個人更喜歡它,因爲JsonNode提供了一系列有用的方法,這些方法在處理這類數據時很有用(結構可能未知或非常動態的數據,所以它不能輕易轉變爲POJO)。

下面的測試用例說明了如何查找行數以及如何打印值。爲了獲得這些值,使用了方法JsonNode.elements(),行數僅僅是調用size()-方法。

public class ArrayNodeTest { 
    @Test 
    public void verifySizeAndPrintRows() throws IOException { 
     final String jsonStr = 
       "[{\"key11\":\"value11\",\"key12\":\"value12\"},\n" + 
         "{\"key21\":\"value21\",\"key22\":\"value22\"},\n" + 
         "{\"keyn1\":\"valuen1\",\"keyn2\":\"valuen2\"}]"; 

     final ObjectMapper mapper = new ObjectMapper(); 
     final JsonNode jsonNode = mapper.readTree(jsonStr); 

     // Verify size 
     Assert.assertEquals(3, jsonNode.size()); 

     // And print rows 
     for (final JsonNode row : jsonNode) { 
      final Iterable<JsonNode> iterable =() -> row.elements(); 
      iterable.forEach(elem -> System.out.println(elem.asText())); 
     } 
    } 
}