Gson не использует значение поля по умолчанию для объектов (не примитивов) - PullRequest
1 голос
/ 19 марта 2019

Я использую gson в проекте Android и получил проблему.Я хочу установить значение по умолчанию для объекта списка, если Api даст мне нулевое значение для этого поля.Я больше не изменяю это поле, поэтому не хочу каждый раз проверять его на нулевое значение

Так что, если быть более подробным

У меня есть, например, этот класс

class Model {
    @Expose private int test = 1;
    @Expose private int primitive = 1;
    @Expose private List<String> strings = new ArrayList<>();
}

и json из Api

{
"test" : 12
}

, поэтому я ожидаю, что gson сгенерирует объект с полями:

Model obj = gson.fromJson(json, Model.class);
// obj.test == 12;
// obj.primitive = 1;
// obj.strings = [] empty string array

, но gson переопределит не примитивные поля

Model obj = gson.fromJson(json, Model.class);
// obj.test == 12;
// obj.primitive = 1; // int is primitive and gson use default value
// obj.strings = null // here error

Я проверил исходный код и обнаружил, что ReflectiveTypeAdapterFactory.BoundField использует значение по умолчанию только для примитивов.

@Override void read(JsonReader reader, Object value) throws IOException, IllegalAccessException {
    Object fieldValue = typeAdapter.read(reader);
    if (fieldValue != null || !isPrimitive) {
        field.set(value, fieldValue);
    }
}

, поэтому я спрашиваю, знает ли кто-нибудь, как решить эту проблему, и заставить gson возвращать ненулевые значения дляне примитивные поля

1 Ответ

0 голосов
/ 21 марта 2019

Я создал простой тест, который показывает, что Gson устанавливает для свойства List<String> значение null, только если для JSON установлено значение null. Ниже тестовое приложение:

import com.google.gson.Gson;
import com.google.gson.annotations.Expose;

import java.util.ArrayList;
import java.util.List;

public class GsonApp {

    public static void main(String[] args) {
        Gson gson = new Gson();

        System.out.println(gson.fromJson("{}", Model.class));
        System.out.println(gson.fromJson("{\"strings\":[]}", Model.class));
        System.out.println(gson.fromJson("{\"strings\":[1,2]}", Model.class));
        System.out.println(gson.fromJson("{\"strings\":null}", Model.class));
        System.out.println(gson.fromJson("{\"test\":12}", Model.class));
    }
}

class Model {

    @Expose
    private int test = 1;

    @Expose
    private int primitive = 1;

    @Expose
    private List<String> strings = new ArrayList<>();

    @Override
    public String toString() {
        return "Model{" +
                "test=" + test +
                ", primitive=" + primitive +
                ", strings=" + strings +
                '}';
    }
}

печать:

Model{test=1, primitive=1, strings=[]}
Model{test=1, primitive=1, strings=[]}
Model{test=1, primitive=1, strings=[1, 2]}
Model{test=1, primitive=1, strings=null}
Model{test=12, primitive=1, strings=[]}

Смотри также:

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