gpt4 book ai didi

java - GSON 避免 JsonSyntaxException 返回部分映射

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:32 25 4
gpt4 key购买 nike

我遇到了这个问题,我不想解决那个问题,但想办法告诉 GSON“跳过错误并继续”解析:

Can't parses json : java.lang.IllegalStateException: 
Expected a string but was BEGIN_OBJECT at line 1 column 16412

使用的代码:

JsonReader reader = new JsonReader(new StringReader(data));
reader.setLenient(true);
Articles articles = gson.create().fromJson(reader, Articles.class);

数据是(为了简化):Articles->Pages->medias.fields。当前错误中的一个字段被定义为字符串,但我收到了一个对象(但同样只出现了一次)。我无法在所有地方添加保护,所以我的问题是:“GSON 中是否有跳过和继续?

我想在节点出现问题时避免使用 GSON 的 JsonSysntaxException,并且我希望至少检索已解析的部分数据。在我的例子中,我会有 99.999% 的数据,只有我的错误字段为空……我知道它看起来不干净,但我会为单元测试或持续集成启用“严格模式”以检测问题和生产我会启用“软模式”以便我的应用程序可以启动(即使服务器端出错)。我不能对我的习惯说,你的应用程序无法启动,因为一篇文章有​​无效数据。

GSON 是否有“出错时跳过并继续”?

最佳答案

解决方法如下:您必须创建 TypeAdapterFactory,这将允许您拦截默认的 TypeAdapter,但仍然让您作为委托(delegate)访问默认的 TypeAdapter。然后,您可以尝试使用来自默认 TypeAdapter 的委托(delegate)来读取值,并根据需要处理意外数据。

      public Gson getGson() {

return new GsonBuilder()
.registerTypeAdapterFactory(new LenientTypeAdapterFactory())
.create();
}


class LenientTypeAdapterFactory 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 {
delegate.write(out, value);
}

public T read(JsonReader in) throws IOException {
try { //Here is the magic
//Try to read value using default TypeAdapter
return delegate.read(in);
} catch (JsonSyntaxException e) {
//If we can't in case when we expecting to have an object but array is received (or some other unexpected stuff), we just skip this value in reader and return null
in.skipValue();
return null;
}
}
};
}
}

关于java - GSON 避免 JsonSyntaxException 返回部分映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17341234/

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