Как проверить, что поле int пусто для gson? [Android] - PullRequest
1 голос
/ 19 апреля 2019

Я хочу сериализовать нули для определенного поля или класса.Я также исследовал стекопоток, но не смог увидеть результат.

 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)

My Pojo

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

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

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

Я действительно рекомендовал первый вариант - он чище, и это был бы правильный способ сделать это.

0 голосов
/ 19 апреля 2019

Возможные решения: 2:

  1. BE должен быть непротиворечивым в этом поле и всегда указывать String или Number (принято Json - в Json таких Double или Integer нет).

  2. Следуйте этому небольшому учебнику , в котором рассказывается, как создать собственный анализатор для ваших классов. Что вы хотите сделать, это проверить экземпляр id при разборе и всегда использовать Integer (или значение null), если указан пустой / недействительный String.

0 голосов
/ 19 апреля 2019

Ваша проблема в id String, а не Integer в "character": { "id": "", "name": "" } Вы должны исправить это из бэкэнда.

...