Java 当根节点只有一个值时,如何使用Jackson读取它们?
我读入了一个有效的JSON文件,该文件的格式如下所示(我对此没有控制权),其中只包含根节点的值,使用:Java 当根节点只有一个值时,如何使用Jackson读取它们?,java,json,jackson,Java,Json,Jackson,我读入了一个有效的JSON文件,该文件的格式如下所示(我对此没有控制权),其中只包含根节点的值,使用: import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; JsonNode rootNode = jsonMapper.readTree(belowString); 如何获取我不知道的根节点名称(下面的第一个和第二个) 随后,我还需要读取出席值 公认的答案是#1。 这是我用于#2访问
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
JsonNode rootNode = jsonMapper.readTree(belowString);
while (iter.hasNext()) {
Map.Entry<String, JsonNode> entry = iter.next();
System.out.println("key: " + entry.getKey());
System.out.println("value: " + entry.getValue());
if (entry.getValue().isArray()) {
JsonNode attending = entry.getValue().get(1).get("attending");
System.out.println("attending = " + attending.toString());
}
}
while(iter.hasNext()){
Map.Entry=iter.next();
System.out.println(“key:+entry.getKey());
System.out.println(“value:+entry.getValue());
if(entry.getValue().isArray()){
JsonNode Attenting=entry.getValue().get(1.get(“Attenting”);
System.out.println(“attenting=“+attenting.toString());
}
}
你就快到了!下面是一个简短的片段。希望这会有所帮助
JsonNode node = mapper.readTree( "{\"First\":[{\"name\":\"Bill\",\"groupName\":\"team1\",\"groupType\":\"golf\",\"info\":[{\"name\":\"George\",\"groupName\":\"Caddy\"}],\"attending\":false},{\"name\":\"Fred\",\"groupName\":\"team2\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Todd\",\"groupName\":\"caddy\"}],\"attending\":false},{\"name\":\"Mike\",\"groupName\":\"team3\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Peter\",\"groupName\":\"caddy\"}],\"attending\":false}],\"Second\":[{\"name\":\"Alan\",\"groupName\":\"team4\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Tony\",\"groupName\":\"caddy\"}],\"attending\":false}]}".getBytes() );
node.fields().forEachRemaining( entry -> System.out.println( "Key "+ entry.getKey() + " Value "+ entry.getValue()) );
输出:
Key First Value [{"name":"Bill","groupName":"team1","groupType":"golf","info":[{"name":"George","groupName":"Caddy"}],"attending":false},{"name":"Fred","groupName":"team2","groupType":"golf","info":[{"name":"Todd","groupName":"caddy"}],"attending":false},{"name":"Mike","groupName":"team3","groupType":"golf","info":[{"name":"Peter","groupName":"caddy"}],"attending":false}]
Key Second Value [{"name":"Alan","groupName":"team4","groupType":"golf","info":[{"name":"Tony","groupName":"caddy"}],"attending":false}]
你快到了!下面是一个简短的片段。希望这会有所帮助
JsonNode node = mapper.readTree( "{\"First\":[{\"name\":\"Bill\",\"groupName\":\"team1\",\"groupType\":\"golf\",\"info\":[{\"name\":\"George\",\"groupName\":\"Caddy\"}],\"attending\":false},{\"name\":\"Fred\",\"groupName\":\"team2\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Todd\",\"groupName\":\"caddy\"}],\"attending\":false},{\"name\":\"Mike\",\"groupName\":\"team3\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Peter\",\"groupName\":\"caddy\"}],\"attending\":false}],\"Second\":[{\"name\":\"Alan\",\"groupName\":\"team4\",\"groupType\":\"golf\",\"info\":[{\"name\":\"Tony\",\"groupName\":\"caddy\"}],\"attending\":false}]}".getBytes() );
node.fields().forEachRemaining( entry -> System.out.println( "Key "+ entry.getKey() + " Value "+ entry.getValue()) );
输出:
Key First Value [{"name":"Bill","groupName":"team1","groupType":"golf","info":[{"name":"George","groupName":"Caddy"}],"attending":false},{"name":"Fred","groupName":"team2","groupType":"golf","info":[{"name":"Todd","groupName":"caddy"}],"attending":false},{"name":"Mike","groupName":"team3","groupType":"golf","info":[{"name":"Peter","groupName":"caddy"}],"attending":false}]
Key Second Value [{"name":"Alan","groupName":"team4","groupType":"golf","info":[{"name":"Tony","groupName":"caddy"}],"attending":false}]
要获取字段名,请执行以下操作:
Iterator<String> iter = rootNode.fieldNames();
while (iter.hasNext()) {
System.out.println("field: " + iter.next());
}
Iterator iter=rootNode.fieldNames();
while(iter.hasNext()){
System.out.println(“字段:+iter.next());
}
要获取名称和值,请执行以下操作:
Iterator<Entry<String, JsonNode>> iter = rootNode.fields();
while (iter.hasNext()) {
Entry<String, JsonNode> entry = iter.next();
System.out.println("key: " + entry.getKey());
System.out.println("value: " + entry.getValue());
}
Iterator iter=rootNode.fields();
while(iter.hasNext()){
Entry=iter.next();
System.out.println(“key:+entry.getKey());
System.out.println(“value:+entry.getValue());
}
获取字段名:
Iterator<String> iter = rootNode.fieldNames();
while (iter.hasNext()) {
System.out.println("field: " + iter.next());
}
Iterator iter=rootNode.fieldNames();
while(iter.hasNext()){
System.out.println(“字段:+iter.next());
}
要获取名称和值,请执行以下操作:
Iterator<Entry<String, JsonNode>> iter = rootNode.fields();
while (iter.hasNext()) {
Entry<String, JsonNode> entry = iter.next();
System.out.println("key: " + entry.getKey());
System.out.println("value: " + entry.getValue());
}
Iterator iter=rootNode.fields();
while(iter.hasNext()){
Entry=iter.next();
System.out.println(“key:+entry.getKey());
System.out.println(“value:+entry.getValue());
}
如果readTree(…)
不是一项要求,您还可以使用readValue(…)
将此Json反序列化为映射,例如:
@Test
public void test() throws Exception {
ObjectMapper jsonMapper = new ObjectMapper();
// JSON contains this kind of a structure
Map<String, List<Map<String, Object>>> map = jsonMapper
// test.json should be in the same package as test and contain
// your Json
.readValue(getClass().getResourceAsStream("test.json"), Map.class);
// Result of this loggion below
map.entrySet().forEach(entry -> {
log.info("key: {}", entry.getKey());
entry.getValue().forEach(person -> {
log.info(" {} attending: {}", person.get("name"), person.get("attending"));
});
});
}
@测试
public void test()引发异常{
ObjectMapper jsonMapper=新的ObjectMapper();
//JSON包含这种结构
Map=jsonMapper
//test.json应该与test和contain位于同一个包中
//你的Json
.readValue(getClass().getResourceAsStream(“test.json”)、Map.class);
//下面是这个日志的结果
map.entrySet().forEach(条目->{
log.info(“key:{}”,entry.getKey());
entry.getValue().forEach(person->{
log.info(“{}出席:{}”、person.get(“姓名”)、person.get(“出席”);
});
});
}
日志应类似于:
键:第一个
账单出席:假
弗雷德:错
迈克:错
键:第二个
艾伦:错
如果readTree(…)
不是必需的,则还可以将此Json反序列化为Map
和readValue(…)
,如:
@Test
public void test() throws Exception {
ObjectMapper jsonMapper = new ObjectMapper();
// JSON contains this kind of a structure
Map<String, List<Map<String, Object>>> map = jsonMapper
// test.json should be in the same package as test and contain
// your Json
.readValue(getClass().getResourceAsStream("test.json"), Map.class);
// Result of this loggion below
map.entrySet().forEach(entry -> {
log.info("key: {}", entry.getKey());
entry.getValue().forEach(person -> {
log.info(" {} attending: {}", person.get("name"), person.get("attending"));
});
});
}
@测试
public void test()引发异常{
ObjectMapper jsonMapper=新的ObjectMapper();
//JSON包含这种结构
Map=jsonMapper
//test.json应该与test和contain位于同一个包中
//你的Json
.readValue(getClass().getResourceAsStream(“test.json”)、Map.class);
//下面是这个日志的结果
map.entrySet().forEach(条目->{
log.info(“key:{}”,entry.getKey());
entry.getValue().forEach(person->{
log.info(“{}出席:{}”、person.get(“姓名”)、person.get(“出席”);
});
});
}
日志应类似于:
键:第一个
账单出席:假
弗雷德:错
迈克:错
键:第二个
艾伦:错
谢谢字段名和字段将无法为我解析。。。。org.codehaus.jacksonJsonNode没有fields\fieldnames属性…您使用的是什么?我使用的是com.fasterxml.jackson.databind.JsonNode,假设您使用的是相同的属性。检查。Yikes,很棒的地方,我们的代码库中有两个版本。使用Java8更容易,但是如何在Java7中访问Attenting属性呢?我尝试在while循环中的entry.getValue().fields()上嵌套第二个迭代器…谢谢。字段名和字段将无法为我解析。。。。org.codehaus.jacksonJsonNode没有fields\fieldnames属性…您使用的是什么?我使用的是com.fasterxml.jackson.databind.JsonNode,假设您使用的是相同的属性。检查。Yikes,很棒的地方,我们的代码库中有两个版本。使用Java8更容易,但是如何在Java7中访问Attenting属性呢?我尝试在while循环中的entry.getValue().fields()上嵌套第二个迭代器…谢谢。我们仍然停留在Java 7上。@boardtc Ok,但不要使用lambda访问映射:)这只是一个演示如何访问映射值的示例,我会在合适的时候将其更新为(…)
版本。readVlue不需要Java8,谢谢。我们仍然停留在Java 7上。@boardtc Ok,但不要使用lambda访问映射:)这只是一个演示如何访问映射值的示例,我会在合适的时候将其更新为(…)版本。readVlue不需要Java 8,请检查org.codehaus.jackson的相关信息。检查org.codehaus.jackson的相关信息。