我在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值
答案 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>
另请参阅: