我的JSON响应中的一个字段是包含多个元素时的String [],而当它只包含一个元素时是String。像这样:
"assets": [
"0901d196804adc1c",
"0901d196804ebd93",
"0901d196804ea5e2"
]
"assets": "0901d196804adc1c"
理想情况下,我想总是得到一个String [],所以如果该元素的JSON类型是String,则将其转换为带有一个元素的String []。
我该怎么做?
答案 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;
}
}