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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18521246/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 08:44:30  来源:igfitidea点击:

json-simple Trying to get specific value from JSON

javajsonjson-simple

提问by Catfish

I'm trying to geocode an address and get the lat/lng coordinates in java. I'm able to geocode the address and have it return in a json object, but I'm unable to figure out how to use json-simple to parse the json below to get the lat/lng. Any help is appreciated.

我正在尝试对地址进行地理编码并在 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"
}

I've tried many different things, but this is my latest failure:

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

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

It produces this stacktrace:

它产生这个堆栈跟踪:

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)

采纳答案by progrenhard

So let me break it down for you so you can understand in JSON's {} denotes an object [] denotes an array. Simple? Yeah.

因此,让我为您分解它,以便您可以理解 JSON 中的 {} 表示一个对象 [] 表示一个数组。简单的?是的。

visual breakdown

视觉分解

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)
  • Basically, in the code you have right now results 0 index would contain "address_components", "formatted_address", "geometry", "types". (NOTE THIS IS ALL ONE OBJECT)

  • "Address_components" is a array.

  • Which contain multiple "Address_components."

  • "Geometry" is just a very very large object in which has many different attributes.

  • Lastly types is an array.

  • 基本上,在您现在拥有的代码中,0 索引将包含“address_components”、“formatted_address”、“geometry”、“types”。(注意这都是一个对象)

  • “Address_components”是一个数组。

  • 其中包含多个“Address_components”。

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

  • 最后类型是一个数组。



psuedo code to retrieve items from arrays, yo!

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

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

(if you want to see code to see how all this is done let me know)

(如果您想查看代码以了解所有这些是如何完成的,请告诉我)

gl man.

人。

回答by jaesanx

That's because the "results" is a JSONArray. Try:

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

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

回答by Bengt

"results" is a JSONArray filled with (in this example just one) JSONObjects. These JSONObjects contain your expected JSONArray "geometry". Following is your code modified, so it loops through the results and printing the geometry data:

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

回答by Prateek

I use net.sf.jsonlibrary but you can use the logic

我使用net.sf.json图书馆,但你可以使用逻辑

Here is the code:

这是代码

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

My Output is :

我的输出是:

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