Моши десериализовать ноль в пустой список - PullRequest
2 голосов
/ 15 марта 2019

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

object {
   @FromJson
   fun fromJson(@Nullable list: List<MyObject>?): List<MyObject> {
                return list ?: emptyList()
   }

    @ToJson
    fun toJson(@Nullable list: List<MyObject>?) = list ?: emptyList()

Это работает для List<MyObject>, но если я использую List<Any> или List<T>, это не работает.Есть ли способ заставить его работать для всех списков?

1 Ответ

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

Адаптеры @FromJson / @ToJson пока не поддерживают универсальные элементы, такие как List.Они соответствуют непосредственно по типу.Вам потребуется полностью выписанный JsonAdapter.Factory.Не забудьте добавить NullToEmptyListJsonAdapter.FACTORY к вашему Moshi.Builder.

final class NullToEmptyListJsonAdapter extends JsonAdapter<List<?>> {
  static final Factory FACTORY = new Factory() {
    @Nullable @Override
    public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations, Moshi moshi) {
      if (!annotations.isEmpty()) {
        return null;
      }
      if (Types.getRawType(type) != List.class) {
        return null;
      }
      JsonAdapter<List<?>> objectJsonAdapter = moshi.nextAdapter(this, type, annotations);
      return new NullToEmptyListJsonAdapter(objectJsonAdapter);
    }
  };

  final JsonAdapter<List<?>> delegate;

  NullToEmptyListJsonAdapter(JsonAdapter<List<?>> delegate) {
    this.delegate = delegate;
  }

  @Override public List<?> fromJson(JsonReader reader) throws IOException {
    if (reader.peek() == JsonReader.Token.NULL) {
      reader.skipValue();
      return emptyList();
    }
    return delegate.fromJson(reader);
  }

  @Override public void toJson(JsonWriter writer, @Nullable List<?> value) throws IOException {
    if (value == null) {
      throw new IllegalStateException("Wrap JsonAdapter with .nullSafe().");
    }
    delegate.toJson(writer, value);
  }
}
...