Java 解析Json数据。提供错误的嵌套对象
所以我有下面的数据,我正在尝试解析数据,我可以在线看到很多关于解析JSONArray的内容,但是对于对象中的对象,我看不到太多。我试了一下,发现了一个错误。以下是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",
{
"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在试图获取其值时缺少了一个附加的树节点地磁场模型结果