- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定我哪里出错了。
我的简单模型是这样的:
final class Data {
final int num;
Data(int num) {
this.num = num;
}
static final class Wrapper {
final List<Data> data;
final long meta;
Wrapper(List<Data> data, long meta) {
this.data = data;
this.meta = meta;
}
}
}
和我的工厂从 Wrapper
中提取 Data
:
final class ObjectAsListJsonAdapterFactory implements JsonAdapter.Factory {
@Override public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations, Moshi moshi) {
if (!List.class.isAssignableFrom(Types.getRawType(type))) {
return null;
}
JsonAdapter<List<Object>> listDelegate = moshi.nextAdapter(this, type, annotations);
Type innerType = Types.collectionElementType(type, List.class);
JsonAdapter<Object> objectDelegate = moshi.adapter(innerType, annotations);
return new ListJsonAdapter<>(listDelegate, objectDelegate);
}
static final class ListJsonAdapter<T> extends JsonAdapter<List<T>> {
private final JsonAdapter<List<T>> listDelegate;
private final JsonAdapter<T> objectDelegate;
ListJsonAdapter(JsonAdapter<List<T>> listDelegate, JsonAdapter<T> objectDelegate) {
this.listDelegate = listDelegate;
this.objectDelegate = objectDelegate;
}
@Override public List<T> fromJson(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonReader.Token.BEGIN_OBJECT) {
return Collections.singletonList(objectDelegate.fromJson(jsonReader));
} else {
return listDelegate.fromJson(jsonReader);
}
}
@Override public void toJson(JsonWriter jsonWriter, List<T> list) throws IOException {
listDelegate.toJson(jsonWriter, list);
}
}
}
但是当我运行时:
String json = "{\n"
+ " \"data\": [\n"
+ " {\n"
+ " \"num\": 5\n"
+ " }\n"
+ " ],\n"
+ " \"meta\": 21\n"
+ "}";
Moshi moshi = new Moshi.Builder().add(new ObjectAsListJsonAdapterFactory()).build();
ParameterizedType type = Types.newParameterizedType(List.class, Data.class);
JsonAdapter<List<Data>> adapter = moshi.adapter(type);
List<Data> expected = adapter.fromJson(json);
expected
包含一个 Data
,其 num
字段的值为 0
。
我错过了什么?
最佳答案
该字段具有其默认值,因为这不是该 JSON 所需的 JsonAdapter.Factory
。该工厂正在尝试制作类似于单个数组项的对象。这是你想要的展开:
static final class DataUnwrapperAdapterFactory implements JsonAdapter.Factory {
@Override
public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations, Moshi moshi) {
if (!List.class.isAssignableFrom(Types.getRawType(type))) {
return null;
}
if (!Data.class.isAssignableFrom(Types.getRawType(Types.collectionElementType(type, List.class)))) {
return null;
}
JsonAdapter<List<Data>> listDelegate = moshi.nextAdapter(this, type, annotations);
JsonAdapter<Data.Wrapper> wrapperDelegate = moshi.adapter(Data.Wrapper.class, annotations);
return new DataUnwrapperAdapter(listDelegate, wrapperDelegate);
}
static final class DataUnwrapperAdapter extends JsonAdapter<List<Data>> {
private final JsonAdapter<List<Data>> listDelegate;
private final JsonAdapter<Data.Wrapper> wrapperDelegate;
DataUnwrapperAdapter(JsonAdapter<List<Data>> listDelegate,
JsonAdapter<Data.Wrapper> wrapperDelegate) {
this.listDelegate = listDelegate;
this.wrapperDelegate = wrapperDelegate;
}
@Override public List<Data> fromJson(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonReader.Token.BEGIN_OBJECT) {
Data.Wrapper wrapper = wrapperDelegate.fromJson(jsonReader);
return wrapper.data;
} else {
return listDelegate.fromJson(jsonReader);
}
}
@Override public void toJson(JsonWriter jsonWriter, List<Data> list) throws IOException {
listDelegate.toJson(jsonWriter, list);
}
}
}
现在,您可以执行以下操作:
String json = "{\n"
+ " \"other_garbage\": \"hiya\",\n"
+ " \"data\": [\n"
+ " {\n"
+ " \"num\": 5\n"
+ " }\n"
+ " ],\n"
+ " \"meta\": 21\n"
+ "}";
Moshi moshi = new Moshi.Builder().add(new DataUnwrapperAdapterFactory()).build();
ParameterizedType type = Types.newParameterizedType(List.class, Data.class);
JsonAdapter<List<Data>> adapter = moshi.adapter(type);
List<Data> expected = adapter.fromJson(json);
非常感谢(一如既往)Jake 和 Jesse 找到了这个解决方案。
关于java - 使用 Moshi JsonAdapter.Factory 反序列化时丢失字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36457864/
假设我们有这个 JSON: [ { "__typename": "Car", "id": "123", "name": "Toyota Prius", "numDo
此场景发生在使用 Retrofit2 和 Moshi 进行 JSON 反序列化的 Android 应用中。 如果您无法控制服务器的实现,并且该服务器在响应请求的方式上有不一致的行为(也称为“坏情况”)
我正在尝试使用 Android 的 Moshi 库将 Java 对象转换为 JSON。该对象包含一个类型的属性 ArrayList 我正在注册以下适配器来转换对象。 Type type = Type
我有一个响应对象: data class ResponseObject( val notCamelcase: String, val param2: String,
使用 Moshi,您可以为类的字段自定义名称 @Json(name = "your name") string name 但是您可以拥有多个自定义名称吗? @Json(name = "your nam
我有这个模型类 data class RvRange(val low: Int?, val high: Int?) 我的 JSON 响应是 {"low":60799.999999999985,"hig
我有一些看起来像这样的 JSON: { "name" : "Credit Card", "code" : "AUD", "value" : 1000 } 并使用 Moshi 将
我不知道如何在 kotlin 中执行此操作。我想将此字符串转换为对象数组: [ {mode=bus, line=381, line_name=381, direction=Waterloo, oper
我可以从服务器获取以下 JSON 数据: { "id": 1, "groupName": "MyBestFriends" } 在我的 Android 项目中,我使用 Moshi 来处理
我的一些成功的服务器响应是: { "error": null, "data": null } 我的模型是: public class BaseResponse { @Json(name = "
有没有办法设置 Moshi adapter自动创建一个 Object或 List基于 JSON 响应?目前,我可以明确地做到这一点。例如,我可以收到以下响应: { "userId": "1",
假设有以下代表服务器响应的参数化数据类: public class SocketResponse { private String responseMessage; private i
我正在尝试使用 reddit JSON API。有些帖子数据对象包含一个名为 edited 的字段,如果帖子未被编辑,该字段可能包含 bool 值 false,如果帖子被编辑,则可能包含时间戳 int
在我的 Android 应用程序中,在发送了一些注册凭据后,我从服务器获得了以下 JSON 输出: { "response":"successfully registered new user", "
我们有一个多态行为,为了满足它的反序列化,我们为它编写了一个自定义的 Moshi 适配器。 @JsonClass(generateAdapter = true) open class Field @J
我从 OrientDB 服务器收到一些 JSON,看起来像这样: { ... "out": ..., "in": ..., ... } 现在这两个字段out和 in可以
使用 Moshi 序列化数据时,有没有办法自动将命名约定应用于 Moshi? 例如 我有这个类,它遵循 Kotlin 属性命名约定(驼峰式大小写) class Player { var cur
我正在寻找 PolymorphicAdapter但是我能找到的所有多态示例都有一个名为“type”的键或类似的东西,可以用来区分要使用的类。但是就我而言,我没有这样的 key 。我对如何解析这样一个奇
我正在尝试运行使用okhttp3进行Rest api调用的示例代码。 MoshiJsonConvertor.kt: import com.squareup.moshi.JsonClass import
我需要解析一个包含属性“触发器”的对象,它是一个 List .此列表可以包含 2 种类型的触发器:自定义和事件。 这是我的触发器类: @JsonClass(generateAdapter = tr
我是一名优秀的程序员,十分优秀!