不使用 JsonNode 读取 JSON 值
Reading JSON value without using JsonNode
示例 JSON 格式如下:
{
myarray: [
{
id: 123,
title: "my title",
name: "my name"
},
{
id: 456,
title: "my title 2",
name: "my name 2"
}
]
}
使用上面的 JSON,我们使用以下代码得到 myarray
:
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(con.getInputStream(), JsonNode.class);
def stations = mapper.readValue(node.get("myarray"), MyClass[].class);
几天后我们升级 json 库并抛出以下异常。
No signature of method: com.fasterxml.jackson.databind.ObjectMapper.readValue() is applicable for argument types: (com.fasterxml.jackson.databind.node.ArrayNode, java.lang.Class)
有什么方法或解决方法可以在不使用 JsonNode 的情况下获取 myarray 对象吗?
(我们现在使用的是com.fasterxml.jackson.databind最新版本)
使用 Jackson Databind 版本 2.9.8。
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'
你需要找到myarray
,然后检查它是否是一个数组。之后,您可以继续遍历其子项。其中 data.json
是包含 JSON 数据的文件。
StationParser.java
import java.io.IOException;
import java.io.InputStream;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
public class StationParser {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
InputStream ios = Library.class.getClassLoader().getResourceAsStream("data.json");
ObjectMapper mapper = new ObjectMapper();
ArrayNode data = (ArrayNode) mapper.readTree(ios).get("myarray");
Station[] stations = mapper.readValue(data.traverse(), Station[].class);
for (Station station : stations) {
System.out.println(station);
}
}
}
输出
Station [id=123, title=my title, name=my name]
Station [id=456, title=my title 2, name=my name 2]
Station.java
public class Station {
private long id;
private String title;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return String.format("Station [id=%s, title=%s, name=%s]", id, title, name);
}
}
示例 JSON 格式如下:
{
myarray: [
{
id: 123,
title: "my title",
name: "my name"
},
{
id: 456,
title: "my title 2",
name: "my name 2"
}
]
}
使用上面的 JSON,我们使用以下代码得到 myarray
:
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(con.getInputStream(), JsonNode.class);
def stations = mapper.readValue(node.get("myarray"), MyClass[].class);
几天后我们升级 json 库并抛出以下异常。
No signature of method: com.fasterxml.jackson.databind.ObjectMapper.readValue() is applicable for argument types: (com.fasterxml.jackson.databind.node.ArrayNode, java.lang.Class)
有什么方法或解决方法可以在不使用 JsonNode 的情况下获取 myarray 对象吗?
(我们现在使用的是com.fasterxml.jackson.databind最新版本)
使用 Jackson Databind 版本 2.9.8。
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'
你需要找到myarray
,然后检查它是否是一个数组。之后,您可以继续遍历其子项。其中 data.json
是包含 JSON 数据的文件。
StationParser.java
import java.io.IOException;
import java.io.InputStream;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
public class StationParser {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
InputStream ios = Library.class.getClassLoader().getResourceAsStream("data.json");
ObjectMapper mapper = new ObjectMapper();
ArrayNode data = (ArrayNode) mapper.readTree(ios).get("myarray");
Station[] stations = mapper.readValue(data.traverse(), Station[].class);
for (Station station : stations) {
System.out.println(station);
}
}
}
输出
Station [id=123, title=my title, name=my name]
Station [id=456, title=my title 2, name=my name 2]
Station.java
public class Station {
private long id;
private String title;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return String.format("Station [id=%s, title=%s, name=%s]", id, title, name);
}
}