gpt4 book ai didi

java - 如何使用 gson 调用默认反序列化

转载 作者:IT老高 更新时间:2023-10-28 12:51:55 24 4
gpt4 key购买 nike

我得到一个具有“字段”字段的 json。
如果“字段”有数据,那么就有一个 OBJECT,其中有许多(大约 20 个)也是对象的其他字段。我可以毫无问题地反序列化它们。
但是如果“字段”没有数据,它就是一个空数组(我知道这很疯狂,但这是来自服务器的响应,我无法更改它)。像这样的:

空时:

"extras":[

]

有一些数据:

"extras": {
"22":{ "name":"some name" },
"59":{ "name":"some other name" },
and so on...
}

所以,如果没有数据(空数组),我显然会得到异常

Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 4319

我尝试使用自定义 JavaDeserializer:

public class ExtrasAdapter implements JsonDeserializer<Extras> {
@Override
public Extras deserialize(JsonElement json, Type typeOf,
JsonDeserializationContext context) throws JsonParseException {
try {
JsonObject jsonObject = json.getAsJsonObject();
// deserialize normally

// the following does not work, as it makes recursive calls
// to the same function
//return context.deserialize(jsonObject,
// new TypeToken<Object>(){}.getType());
} catch (IllegalStateException e) {
return null;
}
}
}

我通过以下方式读取 json

Gson gsonDecoder = new GsonBuilder().registerTypeAdapter(Extras.class, new ExtrasAdapter();
// httpResponse contains json with extras filed.
Reader reader = new InputStreamReader(httpResponse.getEntity().getContent());
Extras response = gsonDecoder.fromJson(reader, Extras.class);

我不想手动反序列化所有 20 个字段(我知道这是一个选项),我只想调用 context.defaultDeserialize() 或类似的东西。
再一次:我在反序列化普通 json、创建自定义对象、注册自定义 TypeAdapter、自定义 JavaDeserializer 方面没有任何问题。这一切都已经奏效了。我只需要一些处理数据的解决方案,既可以是数组也可以是对象。
谢谢你的帮助。

=======================


乔伊的答案很完美。这就是我要找的东西。我将在这里发布我的代码。

public class SafeTypeAdapterFactory implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
return new TypeAdapter<T>() {
public void write(JsonWriter out, T value) throws IOException {
try {
delegate.write(out, value);
} catch (IOException e) {
delegate.write(out, null);
}
}
public T read(JsonReader in) throws IOException {
try {
return delegate.read(in);
} catch (IOException e) {
Log.w("Adapter Factory", "IOException. Value skipped");
in.skipValue();
return null;
} catch (IllegalStateException e) {
Log.w("Adapter Factory", "IllegalStateException. Value skipped");
in.skipValue();
return null;
} catch (JsonSyntaxException e) {
Log.w("Adapter Factory", "JsonSyntaxException. Value skipped");
in.skipValue();
return null;
}
}
};
}
}

最佳答案

尝试使用 GSON >= 2.2.1 并查找 TypeAdapterFactory类。

这将使您能够在反序列化之前检查对象并应用自定义代码,同时避免递归。

这是 getDelegateAdapter 的示例你可以使用。

关于java - 如何使用 gson 调用默认反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com