2011-11-18 133 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())); 
     } 
    } 
}