0

我有以下输入:

在此处输入图像描述

我想提取经纬度。我尝试了以下实现,但我收到了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;
    }

如何修复上述实现?

4

2 回答 2

1

如果您使用的是 com.fasterxml.jackson.databind.JsonNode,则可以通过名称获取预期字段,而不是使用位置

  • 纬度的 positionNode.get("lat").asDouble()
  • 用于 lng 的 positionNode.get("lng").asDouble()

这是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());
        }
    }
于 2020-10-26T10:03:10.440 回答
0

您的输入"[{"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 是使用它们的名称而不是位置提取的。

于 2020-10-26T10:52:30.290 回答