【问题标题】:How to write a TypeAdapter for multiple JSON objects with Gson?如何使用 Gson 为多个 JSON 对象编写 TypeAdapter?
【发布时间】: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


【解决方案1】:

有时很难为 JSON 响应生成 POJO 类。 您可以在这里轻松生成 POJO http://www.jsonschema2pojo.org/

【讨论】:

  • 我使用并选择选项以使其可串行化但无法从类中获取数据作为空点
猜你喜欢
  • 2017-07-27
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多