我正在尝试在android中解析JSON响应。但无法处理动态JSON格式。
这是JSON响应:
{
"code":"1",
"data":{
"220":{
"reg_no":"12",
"device_status":"off"
},
"218":{
"reg_no":"11",
"device_status":"on"
}
}
}
220和219是动态值。
从MainActivity.java调用API
public void getItemData() {
Call<ItemData> call = service.getItemData(token,vehicle_ids);
call.enqueue(new Callback<ItemData>() {
@Override
public void onResponse(@NonNull Call<ItemData> call,@NonNull Response<ItemData> response) {
Log.d("Response",response.body.toString());
progressDoalog.dismiss();
}
@Override
public void onFailure(@NonNull Call<ItemData> call,@NonNull Throwable t) {
progressDoalog.dismiss();
}
});
}
创建ItemData类以处理响应:
ItemData.java
public class VehicleList {
private String code;
private VehicleData data = new VehicleData();
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public VehicleData getData() {
return data;
}
public void setData(VehicleData data) {
this.data = data;
}
}
VehicleData.java
public class VehicleData{
}
我得到回应:
code: 1
data : null
请建议我如何更改我的VehicleData.java类,以便可以处理 响应。
答案 0 :(得分:0)
使用GSON也可以完成相同的事情,但是可以使用GSON转换器适配器将其转换为POJO。我们将手动对其进行解析。这为我们提供了动态JSON数据时的灵活性。 假设在我的情况下,JSON格式如下所示。
{
"code":"1",
"data":{
"220":{
"reg_no":"12",
"device_status":"off"
},
"218":{
"reg_no":"11",
"device_status":"on"
}
}
}
在这种情况下,dateWiseContent具有动态对象键,因此我们将使用JsonParser类解析此json字符串。
//parsing string response to json object
JsonObject jsonObject = (JsonObject) new JsonParser().parse(resource);
//getting root object
JsonObject data = jsonObject.get("data").getAsJsonObject();
使用Map.Entry获取动态键,如下所示:
// your code goes here
for (Map.Entry<String, JsonElement> entry : data.entrySet()) {
//this gets the dynamic keys
String dateKey = entry.getKey();
//you can get any thing now json element,array,object according to json.
JsonArray jsonArrayDates = entry.getValue().getAsJsonArray();
int appointmentsSize = jsonArrayDates.size();
for (int count = 0; count < appointmentsSize; count++) {
JsonObject objectData = jsonArrayDates.get(count).getAsJsonObject();
String device_status = objectData.get("device_status").getAsString();
}
}
类似地,可以使用Map.Entry解析任何级别的动态json
答案 1 :(得分:0)
我使用Hashmap解决了这个问题。
public class ItemData {
Hashmap<String, object> data = new hashmap<>();
}
并使用getter setter可以访问变量。