Java 解析Json数据。提供错误的嵌套对象

Java 解析Json数据。提供错误的嵌套对象,java,android,json,parsing,android-volley,Java,Android,Json,Parsing,Android Volley,所以我有下面的数据,我正在尝试解析数据,我可以在线看到很多关于解析JSONArray的内容,但是对于对象中的对象,我看不到太多。我试了一下,发现了一个错误。以下是Json响应,我只想返回标记的字段: { "geomagnetic-field-model-result": { "model": "wmm", "model_revision": "2020",

所以我有下面的数据,我正在尝试解析数据,我可以在线看到很多关于解析JSONArray的内容,但是对于对象中的对象,我看不到太多。我试了一下,发现了一个错误。以下是Json响应,我只想返回标记的字段:

{
    "geomagnetic-field-model-result": {
        "model": "wmm",
        "model_revision": "2020",
        "date": {
            "value": "2020-07-14"
        },
        "coordinates": {
            "latitude": {
                "units": "deg (north)",
                "value": 0.0
            },
            "longitude": {
                "units": "deg (east)",
                "value": 0.0
            },
            "altitude": {
                "units": "km",
                "value": 0.00
            }
        },
        "field-value": {
            "total-intensity": {
                "units": "nT",
                "value": 123 //Return this*****************
            },
            "declination": {
                "units": "deg (east)",
                "value": -123 //Return this*****************
            },
            "inclination": {
                "units": "deg (down)",
                "value": 123 //Return this*****************
            },
            "north-intensity": {
                "units": "nT",
                "value": 123
            },
            "east-intensity": {
                "units": "nT",
                "value": -123
            },
            "vertical-intensity": {
                "units": "nT",
                "value": 123
            },
            "horizontal-intensity": {
                "units": "nT",
                "value": 123
            }
        },
        "secular-variation": {
            "total-intensity": {
                "units": "nT/y",
                "value": 123
            },
            "declination": {
                "units": "arcmin/y (east)",
                "value": 123
            },
            "inclination": {
                "units": "arcmin/y (down)",
                "value": 123
            },
            "north-intensity": {
                "units": "nT/y",
                "value": 123
            },
            "east-intensity": {
                "units": "nT/y",
                "value": 123
            },
            "vertical-intensity": {
                "units": "nT/y",
                "value": 123
            },
            "horizontal-intensity": {
                "units": "nT/y",
                "value": 123
            }
        }
    }
}
我目前试图解析的内容如下:

public void onResponse(JSONObject response) {
                        try {
                            JSONObject jsonObject = response;
                            String totalIntensity = jsonObject.getJSONObject("field-value").getJSONObject("total-intensity").getString("value");
                            String declination = jsonObject.getJSONObject("field-value").getJSONObject("declination").getString("value");
                            String inclination = jsonObject.getJSONObject("field-value").getJSONObject("inclination").getString("value");


                        } catch (JSONException e) {
                            Log.d("geoData", "Error recorded");
                            e.printStackTrace();
                        }
                    }
import com.fasterxml.jackson.databind.ObjectMapper;

        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonNode = mapper.readTree(input);
        System.out.println(jsonNode.get("geomagnetic-field-model-result").get("field-value").get("total-intensity").get("value"));


我完全错了吗?希望有人能很容易地纠正我的错误。

创建一个模式并使用返回值,这样更容易使用 从返回的响应的示例架构


因此,随着模式不变,这将以正确的格式返回值

您可以像这样使用Jackson:

public void onResponse(JSONObject response) {
                        try {
                            JSONObject jsonObject = response;
                            String totalIntensity = jsonObject.getJSONObject("field-value").getJSONObject("total-intensity").getString("value");
                            String declination = jsonObject.getJSONObject("field-value").getJSONObject("declination").getString("value");
                            String inclination = jsonObject.getJSONObject("field-value").getJSONObject("inclination").getString("value");


                        } catch (JSONException e) {
                            Log.d("geoData", "Error recorded");
                            e.printStackTrace();
                        }
                    }
import com.fasterxml.jackson.databind.ObjectMapper;

        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonNode = mapper.readTree(input);
        System.out.println(jsonNode.get("geomagnetic-field-model-result").get("field-value").get("total-intensity").get("value"));


我假设您在方法中得到的响应是您在这里发布的整个JSON对象

您有几个问题:

  • 您的数据不是字符串而是双精度整数,因此您应该使用
    getDouble
    作为示例
  • 您忘记了另外一个节点
    地磁场模型结果
  • 您不需要分配内部
    JSONObject JSONObject
    ,只需使用response即可
  • 要获得这些值,您应该:

    public void onResponse(JSONObject response) {
        try {
            // JSONObject jsonObject = response; you don't need this
            Double totalIntensity = response
                .getJSONObject("geomagnetic-field-model-result")
                .getJSONObject("field-value")
                .getJSONObject("total-intensity")
                .getDouble("value");
            Double declination = response
                .getJSONObject("geomagnetic-field-model-result")
                .getJSONObject("field-value")
                .getJSONObject("declination")
                .getDouble("value");
            Double inclination = response
                .getJSONObject("geomagnetic-field-model-result")
                .getJSONObject("field-value")
                .getJSONObject("inclination")
                .getDouble("value");
    
            // use it somehow
        } catch (JSONException e) {
            Log.d("geoData", "Error recorded");
            e.printStackTrace();
        }
    }
    

    实际上,您可以对
    坐标
    字段值
    长期变化
    @TDIScott中的每个属性使用相同的类,所以我创建了所有这些类,我是否需要创建所有类来返回我需要的值?一旦我创建了这些,我应该在onResponse中添加什么?@HTBuild一个JSON转换器会在您拥有模式后自动填充所有这些值。您将看到案例中顶部的“对象”
    地磁场模型结果
    作为网络调用的返回类型。因此,这将是
    公共void onResponse(GeomagneticFieldModelResponse)
    @MarkiAnbenovsky我同意这可以细化为一个泛型类,因为每个
    对象的命名约定都没有改变
    这里的问题不是使用Jackson,这是因为OP在试图获取其值时缺少了一个附加的树节点
    地磁场模型结果