我有一個包含一陣列的輸入JSON對象如下所示:傑克遜arraynode
[{"key11":"value11","key12":"value12"},
{"key21":"value21","key22":"value22"},
...
{"keyn1":"valuen1","keyn2":"valuen2"}]
我想用傑克遜解析器中,首先,以確定的行數和第二,僅打印的值上屏幕。我希望它儘可能輕。任何人都可以指出我的方向?
我有一個包含一陣列的輸入JSON對象如下所示:傑克遜arraynode
[{"key11":"value11","key12":"value12"},
{"key21":"value21","key22":"value22"},
...
{"keyn1":"valuen1","keyn2":"valuen2"}]
我想用傑克遜解析器中,首先,以確定的行數和第二,僅打印的值上屏幕。我希望它儘可能輕。任何人都可以指出我的方向?
識別行
什麼是 「行」 的數量?鍵/值對是否是一排?是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
假設一個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()));
}
}
}