Невозможно прочитать данные из объекта, используя gson и модифицировать - PullRequest
0 голосов
/ 11 февраля 2019

Сервер в настоящее время возвращает json, который выглядит как приведенный ниже json, он содержит поле с именем data, которое представляет собой массив массивов, каждый из которых имеет несколько объектов, а каждый объект имеет ключ с именем item_type.Ключ item_type позволяет мне точно определить, что это за тип объекта, чтобы я мог соответственно преобразовать его в java, но не могу прочитать поле item_type.

{  
   "page":1,
   "data":[  
      [  
         {  
            "id":1,
            "name":"xyz",
            "item_type":1
         }
      ],
      [  
         {  
            "cid":1,
            "item_type":2
         }
      ],
      [  
         {  
            "item":1,
            "item_type":3
         }
      ]
   ]
}

Интерфейс модернизацииэто похоже на

    @GET("Search")
        Observable<SearchResults> search(@Query(ParamsHolder.GET_QUERY) 
    String query, @Query(ParamsHolder.GET_PAGE) int page);

, где класс SearchResults выглядит следующим образом

public class SearchResults {

    int page;

    List<List<Object>> data;

    public int getPage() {
        return page;
    }

    public List<List<Object>> getData() {
        return data;
    }
}

Я могу получить данные в порядке, но мне нужно прочитать объекты, которые находятся внутри каждого списка,Чтобы сделать это, я использовал следующий код


public class SearchItem {

  int item_type;

  public int getItemType() {
      return item_type;
  }
}

List<List<Object>> data = objects.getData();

for (int i = 0; i < data.size(); i++) {

  List<Object> list = data.get(i);

  for (int j = 0; j < list.size(); j++) {

    SearchItem item = (SearchItem) list.get(i);

    Log.d("search", " json=" + list.get(j).toString());
    Log.d("search", " item=" + item.toString() + " type=" + item.getItemType());
    }

}

. Я создал фиктивный класс SearchItem, который, как я предполагал, позволил бы мне типизировать тип Object, чтобы я мог прочитать item_type, который позволитя точно знаю, какой это тип объекта.

выдает ошибку com.google.gson.internal.LinkedTreeMap cannot be cast to in.example.models.SearchItem

Конечной целью здесь является возможность привести каждый объект в массиве к правильному типу иЕдинственный способ, которым я могу это сделать, это прочитать ключ item_type в объекте

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

используйте Response в качестве типа возврата в функции модификации вашего интерфейса, как показано ниже

@GET("Search")
Observable<Response<ResponseBody>> search(@Query(ParamsHolder.GET_QUERY) 
              String query, @Query(ParamsHolder.GET_PAGE) int page);

таким образом вы можете получить полное тело json, и теперь у вас есть полный контроль над тем, как анализировать данные на основе item_type

поэтому в основном вы вызываете функцию response.body().string(), чтобы получить тело json

, а затем выполняете анализ вручную, как показано ниже:

 JSONObject jsonObject = null;
        try {
            jsonObject = new JSONObject(response.body().string());
            JSONArray jsonArray = jsonObject.getJSONArray("data");

            //looping through the data array 
            for(int i = 0;i<jsonArray.length();i++){
                JSONArray  childArr = jsonArray.getJSONArray(i);
             //looping through current child array inside data 
                  for(int j = 0;j<childArr .length();j++){
                   JSONObject nestedChildObj =childArr.getJSONObject(j);
                   //now i have access to item_type
                   int item_type =  nestedChildObj .getInt("item_type")
                   //now you can use gson to parse the nestedChildObj based 
                   //on item_type or manually do the parsing
                 }
            }


        } catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
0 голосов
/ 11 февраля 2019

Используйте Gson для непосредственного анализа ответа

Обновление SearchResults

 public class SearchResults {

    int page;

    List<List<SearchItem>> data;

    public int getPage() {
        return page;
    }

    public List<List<SearchItem>> getData() {
        return data;
    }
}

Вы можете получить доступ к item_type следующим образом

searchResult.getData.get(i).get(0).item_type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...