我想像这样反序列化一个json:
{
"software": {
"info": {
"id": "1",
"name": "نرم اقزار",
"type": "complex"
},
"sub": {
"windows": {
"info": {
"id": "2",
"name": "ویندوزی",
"type": "complex"
},
"sub": {
"photoshop": {
"info": {
"id": "3",
"name": "فوتوشاپ",
"type": "product"
}
},
"word": {...}
,
"matlab": {...}
}
}
},
"ios": {...},
"linux": {...}
}
}
}
在Retrofit
中执行此操作我编写了一些这样的模型:
Root.java
public class Root {
public Software software;
}
Software.java
public class Software {
public Info info;
public Sub sub;
}
Info.java
public class info {
public int id;
public String name;
public String type;
}
Sub.java
public class sub {
public Software software;
}
假设所有getter和setter都在Classes中。
我的界面:
ServicesAPI.java
public interface ServicesAPI {
@GET("services.php")
Call<Root> getSofwares();
}
最后我的MainActivity是这样的:
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
ServicesAPI servicesAPI = retrofit.create(ServicesAPI.class);
Call<Root> call = servicesAPI.getSofwares();
call.enqueue(new Callback<Root>() {
@Override
public void onResponse(Call<Root> call, Response<Root> response) {
//some codes
}
@Override
public void onFailure(Call<Root> call, Throwable t) {
//
}
});
当我构建此代码并运行它时,模型只获取第一级和第二级对象的数据。并且第三级中的对象始终给出null
。
答案 0 :(得分:0)
班级名称应以大写字母书写。
在你的案例中,它将是
public class Root {
private Software software;
private Sub sub;
private Ios ios;
// .... and so on
}
由于名称是sub,但数据不同,您可以创建另一个模型,如
public class SubData {
SubInfo info;
class SubInfo {
private int id;
private String name;
private String type;
}
}
您的子类可能看起来像那样
public class Sub {
private Map<String, SubData> sub;
private SubData windows;
}
你需要使用Map来让gson(de)为你序列化它。如果这些数据尚未知晓,您可能希望使用自定义反序列化器并验证&#34;键&#34;是JsonObject或String。
答案 1 :(得分:0)
给定的JSON看起来具有不一致的结构:$.software.sub.windows
,但$.software.ios
和$.software.linux
缺少中间sub
属性。假设后两者必须直接嵌套到$.software.sub
中windows
(与其所有后代结构类似),你只需要Sub
类:它不能像你期望的那样多态。您获取null
的原因只是路径$.software.sub.windows
(以及ios
和linux
上的JSON)未正确映射:{{1期望您的JSON文档具有名为Software.sub
的字段。您只需要像这样修改sub
类:
Software
之后,您可以解析JSON并轻松遍历已解析的对象:
final class Software {
Info info;
Map<String, Software> sub; // previously `public Sub sub;`
}
输出:
فوتوشاپ