как создать класс pojo с динамическим ключом для имени массива

Я работаю с Rxandroid и модифицирую. У меня есть json с динамически изменяющимся именем массива, подобным этому,

{
  "2016-10-02": [
    {
      "name": "foo",
      "id": "1",
      "category": "bar"

    },
    {
     "name": "foo",
      "id": "2",
      "category": "bar"
    },
    {
     "name": "foo",
      "id": "3",
      "category": "bar"
    },
    {
      "name": "foo",
      "id": "4",
      "category": "bar"
    }
  ],
  "2016-10-01": [
    {
      "name": "foo",
      "id": "5",
      "category": "bar"
    },
    {
      "name": "foo",
      "id": "6",
      "category": "bar"
    },
  ],
 "2016-10-03": [
    {
      "name": "foo",
      "id": "5",
      "category": "bar"
    }
  ]
}

Имя ключа даты для каждого массива изменяется автоматически, и количество массивов изменяется. В этом примере есть 3 массива с ключом даты. Но количество этих массивов варьируется.

Я просмотрел различные ссылки в stackoverflow, но не смог решить проблему.


person Suresh Basnet    schedule 29.09.2016    source источник
comment
Вы можете пойти двумя путями. Реализуйте свой собственный десериализатор или сообщите Retrofit, что вам нужен JsonObject (библиотека GSON) в качестве ответа, и получите внутренние массивы из этого объекта.   -  person toshkinl    schedule 29.09.2016
comment
Проверьте этот ответ   -  person Burak Cakir    schedule 29.09.2016
comment
@Suresh Basnet: проверьте приведенный ниже ответ с полным разбором вашего ответа json.   -  person Jai    schedule 29.09.2016
comment
@ Суреш Баснет: это сделано?   -  person Jai    schedule 29.09.2016
comment
@jai Я скопировал свою строку ответа, и каждый раз она показывает значения из строки ответа не с сервера. мы не можем напрямую установить имя, идентификатор и категорию для mCategory. Сначала следует установить массив с динамическим ключом.   -  person Suresh Basnet    schedule 30.09.2016
comment
@Jai спасибо .. забыл заменить обратный вызов на responseBody   -  person Suresh Basnet    schedule 30.09.2016


Ответы (2)


Используйте JSONObject keys(), чтобы получить ключ, а затем вы можете повторить каждый ключ, чтобы получить динамические значения:

    JSONObject object = new JSONObject("your response string")
    Iterator keys = object.keys();

    //Let's consider your POJO class is CategoryClass
    // Let's take HashMap to store your POJO class for specific KEY
    HashMap<String, ArrayList<CategoryClass>> mMap = new HashMap<String, ArrayList<CategoryClass>>();

    while(keys.hasNext()) {
        // here you will get dynamic keys
        String dynamicKey = (String)keys.next();

        // get the value of the dynamic key
        JSONArray dynamicValue = object.getJSONArray(currentDynamicKey);

        //Let's store into POJO Class and Prepare HashMap.
         ArrayList<CategoryClass> mCategoryList = new ArrayList<CategoryClass>();
         for(int i = 0 ; i < dynamicValue.length(); i++){

             CategoryClass mCategory = new CategoryClass();
             mCategory.setName(dynamicValue.getString("name"));
             mCategory.setId(dynamicValue.getString("id"));
             mCategory.setCategory(dynamicValue.getString("category"));

             mCategoryList.add(mCategory);


         }
        //Add Into Hashmap
        mMap.put(dynamicKey, mCategoryList);

    }
person Jai    schedule 29.09.2016

С моей точки зрения, этот формат не рекомендуется. date должно быть таким значением, как "date":"2016-10-01" вместо json key.

person Qian Sijianhao    schedule 29.09.2016
comment
На самом деле это не ответ на вопрос, но это чертовски важный момент! Ключ не должен быть динамическим - person WarrenFaith; 07.12.2016