【问题标题】:Could Gson return the target field which raise exception when deserialize?Gson 可以返回反序列化时引发异常的目标字段吗?
【发布时间】:2018-05-21 11:11:24
【问题描述】:

我正在使用 GsonJson 字符串Java 对象 之间(反)序列化,这很方便,但是当字符串包含一些无效值,gson 只返回异常并说明异常的类型。

例如,我有一些类:

public class Employee {
    public String name;
    public Integer age;
}

如果我尝试像这样反序列化:

try {
    String data = "{\"name\":\"Alan\",\"age\":\"twenty-eight\"}";
    Employee employee = gson.fromJson(data, Employee.class);
} catch (Exception e) {
    logger.warn(e);
}

输出

java.lang.NumberFormatException: For input string: "a"

还有什么方法可以知道无效字段(在这种情况下为“age”)吗?我引用了question,但在这种情况下似乎不合适。

【问题讨论】:

    标签: gson json-deserialization


    【解决方案1】:

    恐怕,从 Gson 2.8.4 开始,您无法做到这一点。如果你检查堆栈跟踪,你可以看到:

    Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "twenty-eight"
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:228)
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:218)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
        at com.google.gson.Gson.fromJson(Gson.java:922)
        at com.google.gson.Gson.fromJson(Gson.java:887)
        at com.google.gson.Gson.fromJson(Gson.java:836)
        at com.google.gson.Gson.fromJson(Gson.java:808)
    

    ReflectiveTypeAdapterFactory.java:131ReflectiveTypeAdapterFactory.java:222 都不会将它们处理的字段传播到抛出的异常。这看起来像是一个问题,似乎值得向 Gson 提交错误报告。

    【讨论】:

      【解决方案2】:

      我正在尝试解决类似的问题(在我的情况下,我实际上想继续处理 json,但似乎你不能轻易做到)。

      在任何情况下,您都可以使用 reader.getPath() 获取导致异常的字段的路径。

      同样根据token获取值:JsonToken token = reader.peek(); 以及基于令牌值的开关,所以如果 JsonToken.STRING,则使用 reader.nextString() 获取值,依此类推。

      【讨论】:

        猜你喜欢
        • 2017-02-07
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多