如何在Android的Retrofit中处理可选的JSON字段?

时间:2015-10-08 07:16:48

标签: java android json gson retrofit

我正在为Android应用程序开发JSON解析器。当我向服务器调用数据时,有一些可选字段,我如何使用GSON转换器在Retrofit中处理这个?

正常回复

{
   "status":"SUCCESS",
   "class-1":{
      "class.enddate":"Jan/10/2016",
      "class.startdate":"Jan/10/2015",
      "class.title":"Physics 1",
      "class.short.description":"Physics 1",
      "class.description":"This is a Physics Class"
   }
}

备用响应,当某些字段没有任何数据时

{
  "status":"SUCCESS",
  "class-1":{
     "class.enddate":"Jan/10/2016",
     "class.startdate":"Jan/10/2015",
     "class.title":"Physics 1"
   }
}

POJO课程

public class MyClass {
    @Expose @SerializedName("status")
    public String status;

    @Expose @SerializedName("class-1")
    public MyClassInformation myClassInformation;
}

public class MyClassInformation {
    @Expose @SerializedName("class.title")
    public String classTitle;

    @Expose @SerializedName("class.short.description")
    public String classShortDescription;

    @Expose @SerializedName("class.description")
    public String classDescription;

    @Expose @SerializedName("class.startdate")
    public String startDate;

    @Expose @SerializedName("class.enddate")
    public String endDate;
}

如何以处理不存在的可选字段的方式创建POJO类? 当字段丢失时,整个MyClassInformation对象变为NULL,请帮助。

2 个答案:

答案 0 :(得分:2)

我设法通过反复试验来解决这个问题,设法通过删除@Expose注释并更改Gson构造函数来使其工作......现在,如果缺少字段并且只丢失了整个对象,则整个对象不会被取消或排除字段显示为null。

这是我改变的, 从

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

Gson gson = new GsonBuilder().create();

希望能帮助任何正在寻找类似答案的人。

答案 1 :(得分:0)

几年前我一直在努力。

可能对此没有好的答案。至少不是我所知道的。

考虑了3个选项:

  1. 将所有成员设置为必须字段(假设它们都已提前知道)并将它们设置为null,以防在没有接收到类型有意义的值的情况下(例如,它对于基本类型并不总是有意义的)。在这里,您将更多的工作放在那些通过JSON但是您的Java代码更简单,但不太灵活的人身上。
  2. 在键值对容器内设置可选字段,其中键和值都是字符串。如果没有传递可选属性,则容器可以是空列表。在这里你有更多的灵活性,但必须更加努力地创建自定义(反)序列化器。
  3. 使用1和2的组合。
  4. 每个选项都有优点和缺点,我最终得到了选项3。

    希望它有所帮助,祝你好运!