将单个JSON元素解析为数组

时间:2017-11-21 11:59:32

标签: java android gson retrofit retrofit2

我的JSON响应中的一个字段是包含多个元素时的String [],而当它只包含一个元素时是String。像这样:

"assets": [
  "0901d196804adc1c",
  "0901d196804ebd93",
  "0901d196804ea5e2"
]

"assets": "0901d196804adc1c"

理想情况下,我想总是得到一个String [],所以如果该元素的JSON类型是String,则将其转换为带有一个元素的String []。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

如果您无法在服务器端编辑响应:请参阅this问题和答案,看起来与您的情况非常相似。

如果您可以编辑响应,只需使用字符串数组(f.e。<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.1.4.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.2.3.Final</version> </dependency> )回复。

答案 1 :(得分:0)

您有两种选择:

1)为gson实现自定义type adapter以处理这种情况(最好的解决方案)。

2)定义Object类型的字段并在运行时将其强制转换为适当的类型

$('#lgTitle').text($(this).attr('alt'));

答案 2 :(得分:0)

如何使用TypeAdapter API?

Gson gson = new GsonBuilder()
    .registerTypeAdapterFactory(SingletonListTypeAdapter.FACTORY)
    .create();

以下将在期望数组类型时检查非数组JSON类型,并尝试将它们转换为单例Java列表。 (请注意,这使用了Lists,而不是数组。如果需要,您可以对其进行调整,但Effective Java指出,应用程序层代码应该优先于数组上的Collections API。)

final class SingletonListTypeAdapter<T> extends TypeAdapter<List<T>> {
  static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
    @SuppressWarnings("unchecked")
    @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
      if (type.getRawType() != List.class) {
        return null;
      }
      TypeToken<?> collectionElementType = TypeToken.get(
          getCollectionElementType((ParameterizedType) type.getType()));
      TypeAdapter<List<Object>> delegate = (TypeAdapter<List<Object>>)
          gson.getDelegateAdapter(this, collectionElementType);
      return (TypeAdapter<T>) new SingletonListTypeAdapter<>(delegate);
    }
  };

  private final TypeAdapter<T> delegate;

  SingletonListTypeAdapter(TypeAdapter<T> delegate) {
    this.delegate = delegate;
  }

  @Override public void write(JsonWriter out, List<T> value) throws IOException {
    out.beginArray();
    for (int i = 0, size = value.size(); i < size; i++) {
      delegate.write(out, value.get(i));
    }
    out.endArray();
  }

  @Override public List<T> read(JsonReader in) throws IOException {
    if (in.peek() != BEGIN_ARRAY) {
      return Collections.singletonList(delegate.read(in));
    }
    in.beginArray();
    List<T> expanding = new ArrayList<>();
    while (in.hasNext()) {
      expanding.add(delegate.read(in));
    }
    in.endArray();
    return Collections.unmodifiableList(expanding);
  }

  static Type getCollectionElementType(ParameterizedType type) {
    Type[] types = type.getActualTypeArguments();
    Type paramType = types[0];
    if (paramType instanceof WildcardType) {
      return ((WildcardType) paramType).getUpperBounds()[0];
    }
    return paramType;
  }
}