我想序列化特定字段或类的空值。 我也研究了stackoverflow,但看不到结果。
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.serializeNulls().create();
我使用了它,但是没有用。 我的Json结果是两种类型。在第一种情况下,Pojo会崩溃。
"character": {
"id": "",
"name": ""
},
"character": {
"id": 10,
"name": "İrem"
}
我的崩溃日志:
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:228)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:218)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
我的Pojo
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private Integer id; // or private int id; Both are failing.
答案 0 :(得分:0)
您的问题是id
是String
而不是Integer
"character": {
"id": "",
"name": ""
}
您应该从后端修复它。
答案 1 :(得分:0)
1)第一个选项,未收到String
。如果没有可用的号码,则应该收到null
。所以看起来像这样:
"character": {"id": null,"name": null}
这可以解决问题。
2)第二种选择-更改数据模型以不寻找Integer
,而只是寻找Object
。但这意味着您需要进行更多的验证工作。
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private Object id;
因此,一旦您这样解析它:
MyPojo pojo = gson.fromJson(jsonString, MyPojo.class);
您必须执行以下操作才能使用id
字段:
if(pojo.getId() instanceof Integer) {
// you know you have a number
} else if (pojo.getId() instanceof String) {
// you know it's not a valid number
}
就是这样!
3)第三种选择:具有两个数据模型。
第一个Integer
:
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private Integer id;
String
的第二个:
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private String id;
因此,当您解析它时,会将其解析为JsonObject
:
JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class);
然后检查您需要映射到哪个:
try {
Integer id = jsonObject.get("id").getAsInt();
// it's a number!!
MyIntegerPojo integerPojo = new Gson().fromJson(jsonObject, MyIntegerPojo.class);
} catch (ClassCastException e) {
// it's not a number
MyStringPojo stringPojo = new Gson().fromJson(jsonObject, MyStringPojo.class);
}
我真的推荐第一个选项-它更清洁,这是正确的选择。
答案 2 :(得分:0)
可能的解决方案是2:
BE必须在此字段上保持一致,并始终提供String
或Number
(Json
接受-没有这样的Double
或{ Integer
中的{1}}。
遵循此small tutorial,它告诉您如何为您的类创建自定义解析器。
您要做的就是在解析id实例时检查它的实例,如果提供了一个空/无效的Json
,请始终使用Integer
(或null
值)。
答案 3 :(得分:0)
如果想防止在读取json值时出现Null Pointer Exceptions,也可以采用如下方法:
1.) 转换为 com.google.gson.JsonObject
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
...
JsonObject convertedJsonObject = JsonParser.parseString( jsonString);
2.) 检查元素是否存在且不是 JsonNull
if( convertedJsonObject.has("key") && !convertedJsonObject.get("key").isJsonNull()){
... do your variable assignment
}