如何检查gson的int字段为null? [Android]

时间:2019-04-19 13:39:26

标签: java android json parsing gson

我想序列化特定字段或类的空值。 我也研究了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.

4 个答案:

答案 0 :(得分:0)

您的问题是idString而不是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:

  1. BE必须在此字段上保持一致,并始终提供StringNumberJson接受-没有这样的Double或{ Integer中的{1}}。

  2. 遵循此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
}