Json 杰克逊阵列节点

Json 杰克逊阵列节点,json,parsing,jackson,Json,Parsing,Jackson,我有一个输入json对象,其中包含一个数组,如下所示: [{"key11":"value11","key12":"value12"}, {"key21":"value21","key22":"value22"}, ... {"keyn1":"valuen1","keyn2":"valuen2"}] 我想使用jackson解析器,首先,识别行数,其次,只在屏幕上打印值。我希望它尽可能轻。有人能给我指个方向吗 标识行数的步骤 什么是“吵架”?键/值对是一行吗?JSON数组的元素(无论它包含多少个键

我有一个输入json对象,其中包含一个数组,如下所示:

[{"key11":"value11","key12":"value12"},
{"key21":"value21","key22":"value22"},
...
{"keyn1":"valuen1","keyn2":"valuen2"}]
我想使用jackson解析器,首先,识别行数,其次,只在屏幕上打印值。我希望它尽可能轻。有人能给我指个方向吗

标识行数的步骤

什么是“吵架”?键/值对是一行吗?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());
      }
    }
  }
}

假设
阵列节点
中的一个条目,下面的简单方法可能有用。它使用
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()));
        }
    }
}
公共类ArrayNodeTest{
@试验
public void verifySizeAndPrintRows()引发IOException{
最终字符串jsonStr=
[{\'key11\':\'value11\',\'key12\':\'value12\'}\n+
{\'key21\':\'value21\',\'key22\':\'value22\'}\n+
“{\'keyn1\':\'valuen1\',\'keyn2\':\'valuen2\'”;
最终ObjectMapper映射器=新ObjectMapper();
final-JsonNode-JsonNode=mapper.readTree(jsonStr);
//验证大小
Assert.assertEquals(3,jsonNode.size());
//并打印行
for(最终JsonNode行:JsonNode){
final Iterable Iterable=()->row.elements();
iterable.forEach(elem->System.out.println(elem.asText());
}
}
}
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()));
        }
    }
}