我有一个包含数组的输入json对象,如下所示:
[{"key11":"value11","key12":"value12"},
{"key21":"value21","key22":"value22"},
...
{"keyn1":"valuen1","keyn2":"valuen2"}]
我想先使用jackson解析器来识别行数,然后再打印屏幕上的值。我希望它尽可能轻量级。有人能指点我的方向吗?
答案 0 :(得分:2)
假设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()));
}
}
}
答案 1 :(得分:0)
标识行数
什么是“排”?键/值对是一行吗?是一个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