如何从 JsonNode 中提取数组?
How to extract an array from a JsonNode?
我有以下输入:
我想提取纬度和经度。我尝试了以下实现,但是我收到了 positionNode.get(i + 1).asDouble()
的空指针异常
private List<CoordinateBE> getCoordinate(final JsonNode positionNode) {
final List<CoordinateBE> listOfEntrances = new ArrayList<>();
for (int i = 0; i < positionNode.size(); i = i + 2) {
final CoordinateBE coordinateBE = new CoordinateBE();
coordinateBE.setLatitude(positionNode.get(i).asDouble());
coordinateBE.setLongitude(positionNode.get(i + 1).asDouble()); <--- Null Pointer Exception !!
listOfEntrances.add(coordinateBE);
}
return listOfEntrances;
}
如何修复上述实现?
如果您使用的是com.fasterxml.jackson.databind.JsonNode,您可以通过名称获取期望的字段,而不是使用位置
- positionNode.get("lat").asDouble() 对于 lat
- positionNode.get("lng").asDouble() 对于 lng
这里是 Java
中的示例
@Test
public void jsonNodeTest() throws Exception{
JsonNode positionNode = new ObjectMapper().readTree("{\"lat\":35.85, \"lng\":139.85}");
System.out.println("Read simple object " + positionNode.get("lat").asDouble());
System.out.println("Read simple object " +positionNode.get("lng").asDouble());
ArrayNode positionNodeArray = (ArrayNode) new ObjectMapper().readTree("[" +
"{\"lat\":35.85, \"lng\":139.85} , " +
"{\"lat\":36.85, \"lng\":140.85}" +
"]");
// With Stream API
positionNodeArray.elements().forEachRemaining(jsonNode -> {
System.out.println("Read in array " + jsonNode.get("lat").asDouble());
System.out.println("Read in array " +jsonNode.get("lng").asDouble());
});
// Without Stream API
Iterator<JsonNode> iter = positionNodeArray.elements();
while(iter.hasNext()) {
JsonNode positionNodeInArray = iter.next();
System.out.println("Read in array with iterator " + positionNodeInArray.get("lat").asDouble());
System.out.println("Read in array with iterator " +positionNodeInArray.get("lng").asDouble());
}
}
您的输入 "[{"lat":35.65, "lng":139.61}]"
是一个只有一个元素的数组。由于 i = i + 2
,您使用的循环会遍历所有其他元素
setLatitude
中的代码获取数组中位置 0 的元素,即 {"lat":35.65, "lng":139.61}
,并将其转换为 Double。
setLongitude 中的代码尝试检索位置 1 处的元素,该元素为空。空对象上的方法 asDouble
导致 NullPointerException。
修复方法如下:
private List<CoordinateBE> getCoordinate(final JsonNode positionNodes) {
final List<CoordinateBE> listOfEntrances = new ArrayList<>();
for (JsonNode positionNode : positionNodes) {
final CoordinateBE coordinateBE = new CoordinateBE();
coordinateBE.setLatitude(positionNode.get("lat").asDouble());
coordinateBE.setLongitude(positionNode.get("lng").asDouble());
listOfEntrances.add(coordinateBE);
}
return listOfEntrances;
}
请注意 for 循环遍历 positionNodes 中的每个对象,并且使用名称而不是位置提取 lat 和 lng。
我有以下输入:
我想提取纬度和经度。我尝试了以下实现,但是我收到了 positionNode.get(i + 1).asDouble()
的空指针异常private List<CoordinateBE> getCoordinate(final JsonNode positionNode) {
final List<CoordinateBE> listOfEntrances = new ArrayList<>();
for (int i = 0; i < positionNode.size(); i = i + 2) {
final CoordinateBE coordinateBE = new CoordinateBE();
coordinateBE.setLatitude(positionNode.get(i).asDouble());
coordinateBE.setLongitude(positionNode.get(i + 1).asDouble()); <--- Null Pointer Exception !!
listOfEntrances.add(coordinateBE);
}
return listOfEntrances;
}
如何修复上述实现?
如果您使用的是com.fasterxml.jackson.databind.JsonNode,您可以通过名称获取期望的字段,而不是使用位置
- positionNode.get("lat").asDouble() 对于 lat
- positionNode.get("lng").asDouble() 对于 lng
这里是 Java
中的示例 @Test
public void jsonNodeTest() throws Exception{
JsonNode positionNode = new ObjectMapper().readTree("{\"lat\":35.85, \"lng\":139.85}");
System.out.println("Read simple object " + positionNode.get("lat").asDouble());
System.out.println("Read simple object " +positionNode.get("lng").asDouble());
ArrayNode positionNodeArray = (ArrayNode) new ObjectMapper().readTree("[" +
"{\"lat\":35.85, \"lng\":139.85} , " +
"{\"lat\":36.85, \"lng\":140.85}" +
"]");
// With Stream API
positionNodeArray.elements().forEachRemaining(jsonNode -> {
System.out.println("Read in array " + jsonNode.get("lat").asDouble());
System.out.println("Read in array " +jsonNode.get("lng").asDouble());
});
// Without Stream API
Iterator<JsonNode> iter = positionNodeArray.elements();
while(iter.hasNext()) {
JsonNode positionNodeInArray = iter.next();
System.out.println("Read in array with iterator " + positionNodeInArray.get("lat").asDouble());
System.out.println("Read in array with iterator " +positionNodeInArray.get("lng").asDouble());
}
}
您的输入 "[{"lat":35.65, "lng":139.61}]"
是一个只有一个元素的数组。由于 i = i + 2
setLatitude
中的代码获取数组中位置 0 的元素,即 {"lat":35.65, "lng":139.61}
,并将其转换为 Double。
setLongitude 中的代码尝试检索位置 1 处的元素,该元素为空。空对象上的方法 asDouble
导致 NullPointerException。
修复方法如下:
private List<CoordinateBE> getCoordinate(final JsonNode positionNodes) {
final List<CoordinateBE> listOfEntrances = new ArrayList<>();
for (JsonNode positionNode : positionNodes) {
final CoordinateBE coordinateBE = new CoordinateBE();
coordinateBE.setLatitude(positionNode.get("lat").asDouble());
coordinateBE.setLongitude(positionNode.get("lng").asDouble());
listOfEntrances.add(coordinateBE);
}
return listOfEntrances;
}
请注意 for 循环遍历 positionNodes 中的每个对象,并且使用名称而不是位置提取 lat 和 lng。