14

我觉得很愚蠢,但我一直在寻找这个。我正在使用 google geocoder 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 的任何部分都是没有意义的。唯一称为“位置”的属性的值是另一个具有两个属性的对象,称为“lng”和“lat”。

如果您希望将此“作为字符串”,最接近的方法是调用(此答案中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

您应该创建类位置以提取“位置”子字段。

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 回答