使用gson进行反序列化时将默认值设置为变量

4uqofj5v  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(199)

我正在尝试将JSON转换为Java对象。当一个对的某个值为null时,它应该设置为某个默认值。
下面是我的POJO

public class Student {      
    String rollNo;
    String name;
    String contact;
    String school;

    public String getRollNo() {
        return rollNo;
    }
    public void setRollNo(String rollNo) {
        this.rollNo = rollNo;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSchool() {
        return school;
    }
    public void setSchool(String school) {
        this.school = school;
    }
}

示例JSON对象:

{
  "rollNo":"123", "name":"Tony", "school":null
}

因此,如果school是null,我应该将其设置为默认值,例如"school":"XXX"。在反序列化对象时,如何使用Gson配置它?

oewdyzsn

oewdyzsn1#

如果null在JSON中,Gson将覆盖您在POJO中设置的任何默认值。您可以费力地创建一个custom deserializer,但在这种情况下,这可能是多余的。
我认为最简单的(并且可以说是最适合您的用例的)方法是等效于Lazy Loading

private static final String DEFAULT_SCHOOL = "ABC Elementary";
public String getSchool() {
    if (school == null) school == DEFAULT_SCHOOL;
    return school;
}
public void setSchool(String school) {
    if (school == null) this.school = DEFAULT_SCHOOL;
    else this.school = school;
}

**注意:**此解决方案的一个大问题是,要更改默认值,必须更改代码。如果希望默认值可自定义,则应使用上面链接的自定义反序列化程序。

umuewwlo

umuewwlo2#

我认为实现这一点的方法是编写无参数构造函数来填充默认值,或者使用自定义示例创建器。然后反序列化器应该替换被反序列化的JSON对象中所有属性的默认值。

p5fdfcr1

p5fdfcr13#

我也遇到了同样的问题,直到我找到this great solution
作为参考,您可以创建一个后处理类:

interface PostProcessable {
      fun gsonPostProcess()
  }

  class PostProcessingEnabler : TypeAdapterFactory {
      fun <T> create(gson: Gson, type: TypeToken<T>): TypeAdapter<T> {
          val delegate = gson.getDelegateAdapter(this, type)

          return object : TypeAdapter<T>() {
              @Throws(IOException::class)
              fun write(out: JsonWriter, value: T) {
                  delegate.write(out, value)
              }

              @Throws(IOException::class)
              fun read(`in`: JsonReader): T {
                  val obj = delegate.read(`in`)
                  if (obj is PostProcessable) {
                      (obj as PostProcessable).gsonPostProcess()
                  }
                  return obj
              }
          }
      }
  }

注册如下:

GsonBuilder().registerTypeAdapterFactory(PostProcessingEnabler())

在您的模型上实现它:

class MyClass : Serializable, PostProcessable {
    // All your variable data
    override fun gsonPostProcess() {
        // All your post processing logic you like on your object
        // set default value for example
    }
}

最后在转换json字符串时使用它:

var myObject = myGson.fromJson(myObjectJson, MyClass::class)

或者使用retrofit2

val api = Retrofit.Builder()
                  .baseUrl(BASE_URL)
                  .addConverterFactory(
                       GsonConverterFactory.create(
                          GsonBuilder().registerTypeAdapterFactory(
                                 GsonPostProcessingEnabler()
                          ).create()
                       )
                   )
                  .client(OkHttpClient.Builder().build())
                  .build()
                  .create(AccountApi::class.java)
qvtsj1bj

qvtsj1bj4#

您只需创建一个检查null的通用函数

model.SchoolName= stringNullChecker(model.SchoolName);

public static String stringNullChecker(String val) {
        if (null == val) val = "";
        return val;
}

相关问题