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

时间:2013-08-29 21:27:00

标签: java json json-simple

我正在尝试对地址进行地理编码并获取java中的lat / lng坐标。我能够对地址进行地理编码并将其返回到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"
}

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

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);
}

它产生这个堆栈跟踪:

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)

4 个答案:

答案 0 :(得分:3)

那是因为“结果”是JSONArray。尝试:

JSONArray results = (JSONArray ) json.getJSONArray("results");

答案 1 :(得分:3)

“results”是一个JSONArray,填充了(在这个例子中只有一个)JSONObjects。这些JSONObject包含您期望的JSONArray“geometry”。以下是您修改的代码,因此它遍历结果并打印几何数据:

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"));
}

答案 2 :(得分:1)

所以让我为你分解,这样你就可以理解JSON的{}表示一个对象[]表示一个数组。简单?是啊。

视觉细分

results 
   index 0 ->
            addressed_components(array)-->
                                       long_name(single entity)
                                       short_name(single entity)
                                       types(array)

            formatted_address(single entity)
            geometry(huge ass object with nested objects)
            types(array)
  • 基本上,在你现在拥有的代码中,结果0索引将包含“address_components”,“formatted_address”,“geometry”,“types”。 (注意这只是一个对象)

  • “Address_components”是一个数组。

  • 其中包含多个“Address_components”。

  • “几何”只是一个非常大的对象,其中有许多不同的属性。

  • 最后,类型是一个数组。


psuedo代码从数组中检索项目,哟!

LOOP THROUGH JSON ARRAY
     ASSIGN OBJECT VALUES // getting different objects that are indexed in the array.

(如果你想查看代码,看看这一切是如何完成的,请告诉我)

gl man。

答案 3 :(得分:1)

我使用net.sf.json库,但您可以使用逻辑

以下是代码

import java.util.Iterator;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;

public class Test {

    static String str = "{  \"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\"}";

    public static void main(String[] args) {
        parseAndCheckJsonObj(str, "");
    }

    static void parseAndCheckJsonObj(Object str, Object key) {
        /*
         * Check whether str is Valid JSON
         *  String i.e. started by { [ or not
         */
        if (JSONUtils.mayBeJSON(str.toString())) {
            try {

                if (JSONUtils.isArray(str)) {
                    /*if block Check for str as a Json Array*/
                    JSONArray rootArr = JSONArray.fromObject(str);
                    for (int i = 0; i < rootArr.size(); i++) {
                        parseAndCheckJsonObj(rootArr.get(i), key);
                    }
                } else {
                    /*else block Check for str as a Json Object*/
                    JSONObject rootObj = JSONObject.fromObject(str);

                    Iterator keyIter = rootObj.keys();
                    while (keyIter.hasNext()) {
                        Object objKey = keyIter.next();
                        parseAndCheckJsonObj(rootObj.get(objKey), objKey);
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            if (key.equals("lat"))
                System.out.println("Latitude is : " + str);
            else if (key.equals("lng"))
                System.out.println("Longitude is : " + str);
            else
                System.out.println(key + " : " + str);
        }
    }
}

我的输出是:

long_name : Minneapolis
short_name : Minneapolis
types : locality
types : political
long_name : Hennepin County
short_name : Hennepin County
types : administrative_area_level_2
types : political
long_name : Minnesota
short_name : MN
types : administrative_area_level_1
types : political
long_name : United States
short_name : US
types : country
types : political
formatted_address : Minneapolis, MN, USA
Latitude is : 45.05125
Longitude is : -93.193794
Latitude is : 44.890144
Longitude is : -93.329163
Latitude is : 44.983334
Longitude is : -93.26666999999999
location_type : APPROXIMATE
Latitude is : 45.05125
Longitude is : -93.193794
Latitude is : 44.890144
Longitude is : -93.329163
types : locality
types : political
status : OK