Как десериализовать неизвестный примитивный тип свойства json с помощью Gson - PullRequest
1 голос
/ 23 февраля 2020

Каков наилучший способ десериализации с использованием Gson простого JSONObject (или JSONArray), но свойство «value» может быть целочисленного, логического или строкового типа

{"label":"Label", "value":56}
{"label":"Label", "value":false}
{"label":"Label", "value":"string value"}

с классом

public class ViewPair {
    @SerializedName("label")
    private String label;
    @SerializedName("value")
    private <Unknown> value;

В соответствии с рекомендациями Deadpool, я пробовал тип JsonPrimitive, но получаю сообщение об ошибке всякий раз, когда хочу получить значение из ViewPair, например:

Gson gson=new Gson();
List<ViewPair>data = gson.fromJson(array.toString(), listType);
JSONObject object = item.getJSONObject("value");
String spinnerLabel=object.getString("label");
JsonPrimitive spinnerValue=(JsonPrimitive) object.get("value");<-error
Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to com.google.gson.JsonPrimitive

1 Ответ

4 голосов
/ 23 февраля 2020

Вы можете проанализировать его как JsonPrimitive , поскольку у него есть методы для проверки типа isBoolean , isNumber и isString , а также методы для получить значение

public class ViewPair {

   @SerializedName("label")
   private String label;

   @SerializedName("value")
   private JsonPrimitive value;

}

Вот пример, который у меня есть для тестирования этих трех сценариев ios

ViewPair targetObject1 = new Gson().fromJson("{\"label\":\"Label\", \"value\":56}", ViewPair.class);
ViewPair targetObject2 = new Gson().fromJson("{\"label\":\"Label\", \"value\":false}", ViewPair.class);
ViewPair targetObject3 = new Gson().fromJson("{\"label\":\"Label\", \"value\":\"string value\"}", ViewPair.class);

Из JsonObject вы можете напрямую получить JsonPrimitive

JsonPrimitive object = item.getAsJsonPrimitive("value");

А из JsonPrimitive вы можете получить значение в требуемом виде

object.getAsString()
object.getAsInt()
object.getAsBoolean()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...