gpt4 book ai didi

json - Moshi 将 null 反序列化为空列表

转载 作者:行者123 更新时间:2023-12-02 12:53:38 37 4
gpt4 key购买 nike

我正在尝试编写一个 null 安全列表适配器,它将一个可为 null 的列表序列化为一个不可为 null 的对象。我知道你可以这样做:

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>它不起作用。有没有办法让它适用于所有列表?

最佳答案

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

关于json - Moshi 将 null 反序列化为空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55179951/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com