Moshi确定JSON是数组还是单个对象

Moshi确定JSON是数组还是单个对象,第1张

Moshi确定JSON是数组还是单个对象

您可以使用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("[]");}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5565825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存