json-simple 尝试从 JSON 中获取特定值

Cat*_*ish 3 java json json-simple

我正在尝试对地址进行地理编码并在 java 中获取纬度/经度坐标。我能够对地址进行地理编码并将其返回到 json 对象中,但我无法弄清楚如何使用 json-simple 解析下面的 json 以获取 lat/lng。任何帮助表示赞赏。

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Minneapolis",
               "short_name" : "Minneapolis",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Hennepin County",
               "short_name" : "Hennepin County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Minnesota",
               "short_name" : "MN",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Minneapolis, MN, USA",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 45.05125,
                  "lng" : -93.193794
               },
               "southwest" : {
                  "lat" : 44.890144,
                  "lng" : -93.32916299999999
               }
            },
            "location" : {
               "lat" : 44.983334,
               "lng" : -93.26666999999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 45.05125,
                  "lng" : -93.193794
               },
               "southwest" : {
                  "lat" : 44.890144,
                  "lng" : -93.32916299999999
               }
            }
         },
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的东西,但这是我最近的失败:

JSONObject json = (JSONObject)parser.parse(addressAsString);
JSONObject results = (JSONObject) json.get("results");    <-- LINE 186
JSONArray geometry = (JSONArray) results.get("geometry");

for(int i = 0; i < geometry.size(); i++) {
    JSONObject p = (JSONObject) geometry.get(i);
    System.out.println(p);
}
Run Code Online (Sandbox Code Playgroud)

它产生这个堆栈跟踪:

Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject
    at com.AddressGeocoder.geocode(AddressGeocoder.java:186)
    at com.AddressGeocoder.<init>(AddressGeocoder.java:48)
    at com.Geocoder.main(Geocoder.java:7)
Run Code Online (Sandbox Code Playgroud)

Ben*_*ngt 5

"results" 是一个 JSONArray,里面装满了(在这个例子中只有一个)JSONObjects。这些 JSONObjects 包含您预期的 JSONArray“几何”。以下是您修改的代码,因此它会遍历结果并打印几何数据:

JSONObject json = (JSONObject)parser.parse(addressAsString);
JSONArray results = (JSONArray) json.get("results");
for (int i = 0; i < results.size(); i++) {
    // obtaining the i-th result
    JSONObject result = (JSONObject) results.get(i);
    JSONObject geometry = (JSONObject) result.get("geometry");
    JSONObject location = (JSONObject) geometry.get("location");
    System.out.println(location.get("lat"));
    System.out.println(location.get("lng"));
}
Run Code Online (Sandbox Code Playgroud)