Gson请勿将默认字段值用于对象(不是基元) [英] Gson don't use default field value for objects (not primitives)
问题描述
我在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屋!