解析Json Response Android更新动态值

时间:2019-05-24 09:23:58

标签: android json retrofit

我正在尝试在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类,以便可以处理 响应。

2 个答案:

答案 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可以访问变量。