如何检查gson的int字段是否为空?[Android]

r55awzrz  于 2022-11-06  发布在  Android
关注(0)|答案(4)|浏览(298)

我想为一个特定的字段或类序列化空值。我也研究了堆栈溢出,但没有看到结果。

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)

美波霍

@SerializedName("name")
  private String name;
  @SerializedName(value = "id")
  private Integer id; // or private int id; Both are failing.
xqkwcwgp

xqkwcwgp1#

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);

然后检查您需要Map到的位置:

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);
}

我真心推荐第一种选择-它更干净,而且是正确的做法。

2g32fytz

2g32fytz2#

您的问题是idString,而不是"character": { "id": "", "name": "" }中的Integer。您应该从后端修复它。

mxg2im7a

mxg2im7a3#

可能的解决方案有2:

  1. BE必须在此字段上保持一致,并始终提供StringNumber(被Json接受-Json中没有这样的DoubleInteger)。
    1.遵循small tutorial,它告诉你如何为你的类创建一个定制的解析器。你要做的是在解析id的时候检查它的示例,如果提供了一个空的/无效的String,总是使用一个Integer(或者一个null值)。
llew8vvj

llew8vvj4#

如果要防止在阅读json值时出现空指针异常,还可以执行以下方法:
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
}

相关问题