Gson请勿将默认字段值用于对象(不是基元)

时间:2019-03-19 15:35:05

标签: java android gson

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

所以如果要更详细

例如,我有此类

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

和来自api的json

{
"test" : 12
}

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

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

但是gson会覆盖非原始字段

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仅将默认值用于基元。

@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值

1 个答案:

答案 0 :(得分:0)

我创建了一个简单的测试,该测试表明Gson仅在List<String>有效载荷中将null的属性设置为null时,才将JSON的属性设置为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=[]}

打印:

<ng-container>

另请参阅: