Gson请勿将默认字段值用于对象(不是基元) [英] Gson don't use default field value for objects (not primitives)

查看:51
本文介绍了Gson请勿将默认字段值用于对象(不是基元)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Android项目中使用了gson并出现了问题.如果Api给我该字段的空值,我想为列表对象设置默认值.我不再修改该字段,所以我不想每次都检查它是否为空值

I use gson in android project and got problem. I want to set default value for list object if Api give me null value for this field. I don't modify this field any more so i don't want to check it every time for null value

所以如果要更详细

例如,我有此类

class Model {
    @Expose private int test = 1;
    @Expose private int primitive = 1;
    @Expose private List<String> strings = new ArrayList<>();
}

和来自api的json

and json from Api

{
"test" : 12
}

所以我希望gson会生成带有字段的对象:

so i expect what gson will generate object with fields:

Model obj = gson.fromJson(json, Model.class);
// obj.test == 12;
// obj.primitive = 1;
// obj.strings = [] empty string array

但是gson会覆盖非原始字段

but gson override non primitive fields

Model obj = gson.fromJson(json, Model.class);
// obj.test == 12;
// obj.primitive = 1; // int is primitive and gson use default value
// obj.strings = null // here error

我检查了源代码,发现什么ReflectiveTypeAdapterFactory.BoundField仅将默认值用于基元.

I checked source code and found what ReflectiveTypeAdapterFactory.BoundField use default value only for primitives.

@Override void read(JsonReader reader, Object value) throws IOException, IllegalAccessException {
    Object fieldValue = typeAdapter.read(reader);
    if (fieldValue != null || !isPrimitive) {
        field.set(value, fieldValue);
    }
}

所以我要问是否有人知道如何解决此问题,并使gson为非原始字段返回非null值

so i'm asking if somebody know how fix this problem, and make gson return non null values for non primitives fields

推荐答案

我创建了一个简单的测试,该测试显示 Gson List< String> 属性设置为 null仅当在 JSON 有效负载中设置为 null 时.在测试应用下方:

I created simple test which shows that Gson sets List<String> property to null only when is set to null in JSON payload. Below test app:

import com.google.gson.Gson;
import com.google.gson.annotations.Expose;

import java.util.ArrayList;
import java.util.List;

public class GsonApp {

    public static void main(String[] args) {
        Gson gson = new Gson();

        System.out.println(gson.fromJson("{}", Model.class));
        System.out.println(gson.fromJson("{\"strings\":[]}", Model.class));
        System.out.println(gson.fromJson("{\"strings\":[1,2]}", Model.class));
        System.out.println(gson.fromJson("{\"strings\":null}", Model.class));
        System.out.println(gson.fromJson("{\"test\":12}", Model.class));
    }
}

class Model {

    @Expose
    private int test = 1;

    @Expose
    private int primitive = 1;

    @Expose
    private List<String> strings = new ArrayList<>();

    @Override
    public String toString() {
        return "Model{" +
                "test=" + test +
                ", primitive=" + primitive +
                ", strings=" + strings +
                '}';
    }
}

打印:

Model{test=1, primitive=1, strings=[]}
Model{test=1, primitive=1, strings=[]}
Model{test=1, primitive=1, strings=[1, 2]}
Model{test=1, primitive=1, strings=null}
Model{test=12, primitive=1, strings=[]}

另请参阅:

这篇关于Gson请勿将默认字段值用于对象(不是基元)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆