服务器当前返回的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
键
答案 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();
}