java - 我有一个 json 字符串,但无法提取特定字段

标签 java json jackson

我有一个如下所示的 json 字符串:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Arad",
               "short_name" : "Arad",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Arad",
               "short_name" : "Arad",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Arad County",
               "short_name" : "AR",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Romania",
               "short_name" : "RO",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Arad, Romania",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 46.2217118,
                  "lng" : 21.3823449
               },
               "southwest" : {
                  "lat" : 46.1286902,
                  "lng" : 21.230371
               }
            },
            "location" : {
               "lat" : 46.1865606,
               "lng" : 21.3122677
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 46.2217118,
                  "lng" : 21.3823449
               },
               "southwest" : {
                  "lat" : 46.1286902,
                  "lng" : 21.230371
               }
            }
         },
         "place_id" : "ChIJw1lco0uYRUcRkYRVPkoHcA8",
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}

我的java代码:

jsonString = readUrl("https://maps.googleapis.com/")
rootNode = objectMapper.readTree(jsonString);
JsonNode resultsNode = rootNode.path("results");
        JsonNode addressNode = resultsNode.path("address_components");
        JsonNode geometryNode = addressNode.path("geometry");
        JsonNode locationNode = geometryNode.path("location");
        JsonNode latNode = locationNode.path("lat");
        JsonNode lngNode = locationNode.path("lng");
        System.out.println(latNode.asDouble());
        System.out.println(lngNode.asDouble());

最后两行打印 0.0 和 0.0。如何从该 json 中获取 lat 和 lng 信息? p.s 我没有发布完整的网址链接。 也许 jsonNodes 不正确,但我找不到解决方案。

最佳答案

问题是 results 不是一个对象,而是一个对象数组。您必须按索引选择元素。正确的解决办法是:

jsonString = readUrl("https://maps.googleapis.com/")
rootNode = objectMapper.readTree(jsonString);
JsonNode resultsNode = rootNode.path("results");
JsonNode addressNode = resultsNode.get(0); //selecting first json object from an array
JsonNode geometryNode = addressNode.path("geometry");
JsonNode locationNode = geometryNode.path("location");
JsonNode latNode = locationNode.path("lat");
JsonNode lngNode = locationNode.path("lng");
System.out.println(latNode.asDouble());
System.out.println(lngNode.asDouble());

您可能还想迭代结果中的所有对象,在这种情况下,将打印每个对象坐标的代码应该是:

jsonString = readUrl("https://maps.googleapis.com/")
rootNode = objectMapper.readTree(jsonString);
JsonNode resultsNode = rootNode.path("results");
Iterator<JsonNode> results = resultsNode.elements();
while(results.hasNext()){
    JsonNode addressNode = results.next();
    JsonNode geometryNode = addressNode.path("geometry");
    JsonNode locationNode = geometryNode.path("location");
    JsonNode latNode = locationNode.path("lat");
    JsonNode lngNode = locationNode.path("lng");
    System.out.println(latNode.asDouble());
    System.out.println(lngNode.asDouble());
}

关于java - 我有一个 json 字符串,但无法提取特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39101478/

相关文章:

java - C++ 创建 .堆上的运算符?

java - Hibernate Criteria 按子记录数排序

iphone - 如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?

java - 如何在 Mongo 中正确设置 JsonNode 但没有像在 Java 中使用 Jackson 的 String 那样设置它?

java - 由于InvalidDefinitionException,javamoney的CurrencyUnit不能用作字段的类并被Jackson反序列化

Java 游戏 - 使用矩形进行墙壁碰撞检测

工作队列的 Java 并发抽象

javascript - 需要一个JSON对象,数组或literal.json

php - stdClass 类的对象无法转换为字符串 - 找不到解决方案

generics - 使用 jackson-module-kotlin 反序列化通用类