14

馬鹿げている気がしますが、しばらくこれを探していました。私はグーグルジオコーダーAPIを使用していますが、jsonの応答について少しサポートが必要です。これが私が持っているJSONObjectです:

{
"viewport": {
    "southwest": {
        "lng": -78.9233749802915,
        "lat": 36.00696951970851
    },
    "northeast": {
        "lng": -78.92067701970849,
        "lat": 36.0096674802915
    }
},
"location_type": "ROOFTOP",
"location": {
    "lng": -78.922026,
    "lat": 36.0083185
}
}

「場所」サブフィールドを独自の変数に引き出すにはどうすればよいですか?試しjsonObjectVariable.getString("location");てみjsonObjectVariable.getDouble()ましたが、正しく戻りません。jsonオブジェクトのサブフィールドを何と呼びますか?object.subobject構文を使用してサブフィールドにアクセスできることを読みましたが、必要なものが得られません。

(私はライブラリとしてjson-orgを使用しています)

助けてくれてありがとう!

4

4 に答える 4

21

Java用のjson.orgライブラリでJSONObjectは、最初に親インスタンスを取得することによってのみ、オブジェクトの個々のプロパティを取得できます。

JSONObject object = new JSONObject(json);
JSONObject location = object.getJSONObject("location");
double lng = location.getDouble("lng");
double lat = location.getDouble("lat");

次のように、「ドット付き表記」を使用してプロパティにアクセスしようとしている場合:

JSONObject object = new JSONObject(json);
double lng = object.getDouble("location.lng");
double lat = object.getDouble("location.lat");

その場合、json.orgライブラリはあなたが探しているものではありません:それはこの種のアクセスをサポートしていません。


getString("location")サイドノードとして、質問で指定されたJSONの任意の部分を呼び出すことは意味がありません。「location」と呼ばれる唯一のプロパティの値は、「lng」と「lat」と呼ばれる2つのプロパティを持つ別のオブジェクトです。

これを「文字列として」必要な場合、最も近いのは(この回答の最初のコードスニペット)を呼び出すことtoString()ですJSONObject location。これにより、のようなものが得られます{"lng":-78.922026,"lat":36.0083185}

于 2012-04-17T20:36:36.230 に答える
5

jsonObjectVariable.getJSONObject( "location")を使用する必要があると思います。これにより、別のJSONObjectが返されます。

次に、そのオブジェクトでgetDouble( "lng")またはgetDouble( "lat")を呼び出すことができます。

例えば

double lat = jsonObjectVariable.getJSONObject("location").getDouble("lat");
于 2012-04-17T19:50:54.803 に答える
0

「location」サブフィールドをプルするには、ClassLocationを作成する必要があります。

public class Location {
    private double lat;
    private double lng;

@JsonCreator
    public Location(@JsonProperty("lat") double lat, @JsonProperty("lng") double lng {
        this.lat = lat;
        this.lngenter code here = lng;
    }
于 2015-05-06T11:51:38.920 に答える
-1

JSONObjectクラスを拡張public Object get(String key) throws JSONExceptionし、次のようにオーバーライドできます。

public Object get(String key) throws JSONException {
    if (key == null) {
        throw new JSONException("Null key.");
    }

    Object object = this.opt(key);
    if (object == null) {
        if(key.contains(".")){
            object = this.getWithDotNotation(key);
        }
        else
            throw new JSONException("JSONObject[" + quote(key) + "] not found.");
    }
    return object;
}


private Object getWithDotNotation(String key) throws JSONException {
    if(key.contains(".")){
        int indexOfDot = key.indexOf(".");
        String subKey = key.substring(0, indexOfDot);
        JSONObject jsonObject = (JSONObject)this.get(subKey);
        if(jsonObject == null){
            throw new JSONException(subKey + " is null");
        }
        try{
            return jsonObject.getWithDotNotation(key.substring(indexOfDot + 1));                
        }catch(JSONException e){
            throw new JSONException(subKey + "." + e.getMessage());
        }
    }
    else
        return this.get(key);
}

例外をより適切に処理してください。正しく処理されていないことを確認してください。ありがとう

于 2013-07-28T11:54:23.477 に答える