有没有办法将Moshi设置adapter
为自动创建一个Object
或List<Object>
基于JSON响应?目前,我可以明确地执行此操作。例如,我可以收到以下响应:
{
"userId": "1",
"id": "2",
"body": "body...",
"title": "title..."
}
要么
[
{
"userId": "1",
"id": "2",
"body": "body...",
"title": "title..."
}
]
我想创建Object
或List<Object>
不必明确指定要使用的那个。
您可以使用JsonQualifier对此进行概括。从您的示例中,您可能会像
final class Foo {
@SingleToArray final List<User> users;
}
这是带有测试的代码,可以更深入地演示。
@Retention(RUNTIME)
@JsonQualifier public @interface SingleToArray {
final class Adapter extends JsonAdapter<List<Object>> {
final JsonAdapter<List<Object>> delegateAdapter;
final JsonAdapter<Object> elementAdapter;
public static final Factory FACTORY = new Factory() {
@Nullable @Override
public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations,
Moshi moshi) {
Set<? extends Annotation> delegateAnnotations =
Types.nextAnnotations(annotations, SingleToArray.class);
if (delegateAnnotations == null) {
return null;
}
if (Types.getRawType(type) != List.class) {
throw new IllegalArgumentException(
"Only lists may be annotated with @SingleToArray. Found: " + type);
}
Type elementType = Types.collectionElementType(type, List.class);
JsonAdapter<List<Object>> delegateAdapter = moshi.adapter(type, delegateAnnotations);
JsonAdapter<Object> elementAdapter = moshi.adapter(elementType);
return new Adapter(delegateAdapter, elementAdapter);
}
};
Adapter(JsonAdapter<List<Object>> delegateAdapter, JsonAdapter<Object> elementAdapter) {
this.delegateAdapter = delegateAdapter;
this.elementAdapter = elementAdapter;
}
@Nullable @Override public List<Object> fromJson(JsonReader reader) throws IOException {
if (reader.peek() != JsonReader.Token.BEGIN_ARRAY) {
return Collections.singletonList(elementAdapter.fromJson(reader));
}
return delegateAdapter.fromJson(reader);
}
@Override public void toJson(JsonWriter writer, @Nullable List<Object> value)
throws IOException {
if (value.size() == 1) {
elementAdapter.toJson(writer, value.get(0));
} else {
delegateAdapter.toJson(writer, value);
}
}
}
}
@Test public void singleToArray() throws Exception {
Moshi moshi = new Moshi.Builder().add(SingleToArray.Adapter.FACTORY).build();
JsonAdapter<List<String>> adapter =
moshi.adapter(Types.newParameterizedType(List.class, String.class), SingleToArray.class);
assertThat(adapter.fromJson("[\"Tom\",\"Huck\"]")).isEqualTo(Arrays.asList("Tom", "Huck"));
assertThat(adapter.toJson(Arrays.asList("Tom", "Huck"))).isEqualTo("[\"Tom\",\"Huck\"]");
assertThat(adapter.fromJson("\"Jim\"")).isEqualTo(Collections.singletonList("Jim"));
assertThat(adapter.toJson(Collections.singletonList("Jim"))).isEqualTo("\"Jim\"");
assertThat(adapter.fromJson("[]")).isEqualTo(Collections.emptyList());
assertThat(adapter.toJson(Collections.<String>emptyList())).isEqualTo("[]");
}
问题内容: 我正在使用.net Web API来获取json并将其返回给前端以获取角度。json可以是对象或数组。我的代码当前仅适用于数组,而不适用于对象。我需要找到一种方法来尝试解析或确定内容是否是对象或数组。 这是我的代码 以上可能不是最好的方法。它就是我现在所在的位置。 问题答案: 使用Json.NET,您可以这样做:
问题内容: 我将从服务器接收JSON对象或数组,但是我不知道它将是什么。我需要使用JSON,但是要这样做,我需要知道它是对象还是数组。 我正在使用Android。 有没有人有这样做的好方法? 问题答案: 我找到了更好的方法来确定: tokenizer可以返回更多类型:http : //developer.android.com/reference/org/json/JSONTokener.html
问题内容: 有没有办法找出采用varargs的Java函数(或构造函数)是否实际上是用varargs或数组调用的? 说我有以下几点: 构造函数可以用单个参数调用,以后可以更改,如果我不复制构造函数中的数组,这些更改也将应用于成员变量,对吗?但是,如果用几个s 调用构造函数,则没有其他对array *的引用可以在类之外稍后对其进行更改,因此我可以直接对其进行分配。我可以告诉构造函数(或通常带有var
本文向大家介绍sitecore 确保值是对还是错,包括了sitecore 确保值是对还是错的使用技巧和注意事项,需要的朋友参考一下 示例 要断言值是true还是false,请执行以下操作: 您还可以为异常消息传递格式化参数
问题内容: 我需要确定JavaScript中的数组中是否已存在对象。 例如(dummycode): 现在,“carBrands”数组包含所有实例。我现在正在寻找一种快速解决方案,以检查car1,car2,car3或car4的实例是否已经在carBrands数组中。 例如: car1和car4包含相同的数据,但是不同的实例,应测试它们是否相等。 我是否在创建时向对象添加了哈希值?还是有更快的方法来用
问题内容: 我有三个类(,和),它们扩展了另一个类()。如何判断对象属于哪个子类?到目前为止,我有一个具有类名称的属性,但是我认为可以使用类似于javascript的typeof的运算符。(类似:) 问题答案: 您可以使用关键字。 但是请注意,需要使用它通常是不良设计的标志。通常,您应该在每个派生类中编写方法覆盖,以便您无需显式地检查是哪个类。