无法使用gson和改型从对象读取数据

时间:2019-02-11 15:22:37

标签: java android arrays object gson

服务器当前返回的json如下所示,它包含一个名为data的字段,该字段是一个数组数组,每个数组都有多个对象,每个对象都有一个称为{{1}的键}。密钥item_type允许我确切地知道它是什么类型的对象,以便可以在Java中进行相应的转换,但是我无法读取item_type字段。

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

2 个答案:

答案 0 :(得分:1)

使用Gson直接解析响应

更新搜索结果

const mongoUri=mongodb://${process.env.dbName}.documents.azure.com:${process.env.cosmosPort}/?ssl/=true&sslverifycertificate=false`;

mongoose.connect(mongoUri,{ auth: { user: process.env.dbName, password: 
process.env.key }, useNewUrlParser: true }).then(() => 
console.log('connection successful'))
.catch((err) => console.error(err));

您可以像这样访问item_type

 public class SearchResults {

    int page;

    List<List<SearchItem>> data;

    public int getPage() {
        return page;
    }

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

答案 1 :(得分:1)

在界面改造函数中使用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();
        }