【发布时间】:2017-05-03 13:45:22
【问题描述】:
我有一个包含多个嵌套 JSON 对象的 JSON 提要。我已经编写了我的 POJO 类,并在这里查看了如何反序列化嵌套的 JSON 对象以访问我需要的数据。但是我仍然在我的嵌套 JSON 对象上收到 NullPointerExceptions:
JSON 提要示例
{
"data": [
{
"relationships": {
"dismissals": {
"meta": {
"count": {
"home": 0,
"away": 0
}
},
"data": []
},
"home": {
"data": {
"type": "teams",
"id": "2"
}
}
}
}
]
}
Pojo 映射
关系:
public class Relationships implements Serializable
@SerializedName("region")
@Expose
private Region region;
@SerializedName("competition")
@Expose
private Competition competition;
getters and setters
}
地区:
public class Region implements Serializable
{
@SerializedName("data")
@Expose
private Data data;
}
数据
public class Data implements Serializable, Parcelable
{
@SerializedName("type")
@Expose
private String type;
@SerializedName("id")
@Expose
private String id;
}
我的TypeAdapter
public class ItemTypeDataFactory implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(Gson gson, final TypeToken<T> type) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
return new TypeAdapter<T>() {
public void write(JsonWriter out, T value) throws IOException {
delegate.write(out, value);
}
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
}
return delegate.fromJsonTree(jsonElement);
}
}.nullSafe();
}}
改造建造者:
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new ItemTypeDataFactory()) // This is the important line ;)
.setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
RequestInterface request = retrofit.create(RequestInterface.class);
例如我想得到:
getRelationships().getDissmissals().Meta().Count().Home();
当我运行我的应用程序时,我会得到 NullPointerException。
是否需要向我的类型适配器添加一些东西来反序列化类,以便我可以在多个嵌套的 JSON 对象中获取数据?我已经尝试过查看这里,但没有任何帮助。
【问题讨论】:
-
为什么不只发布 POJO 映射?此外,
getRelationships().getDissmissals().Meta().Count().Home()- 任何调用都可能在此处导致 NPE。解开它可以帮助您找出导致 NPE 的访问器。 -
嗨 Lyubomyr-shaydariv,我没有发布映射,因为一页中有很多代码,但现在可以做
-
好吧,你得到 NPE 是因为你的映射出了问题。如果您可以发布 short 映射,那就太好了:只发布您在问题中发布的属性(关系、解雇、元、计数和家庭),然后跳过其余部分,只保留必需品——他们足以发现有问题的财产。至少它可能会更清楚地说明您为什么需要那里的类型适配器......
-
我已经发布了上面的映射,编辑了帖子,不确定它可以缩短多少,因为删除了不必要的 getter 和 setter,只显示了创建的映射。
-
还有一些缺失的类:其中一个是
Competition。无论如何,不要浪费更多时间,只需将您的getRelationships().getDissmissals().Meta().Count().Home()拆分为单独的语句(如relations = getRelations(); dismissals = relations.getDismissals) - 您会发现有问题的映射,因为链式方法很难以这种方式调试。
标签: java android json gson retrofit