Gson可以返回在反序列化时引发异常的目标字段吗?

时间:2018-05-21 11:11:24

标签: gson json-deserialization

我使用 Gson 来(<)在 Json字符串 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"

是否有任何方法可以了解无效字段(&#34; 年龄 &#34;在这种情况下)?我引用了question,但在这种情况下似乎不合适。

2 个答案:

答案 0 :(得分:0)

我害怕,你不能像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提交错误报告。

答案 1 :(得分:0)

我正在尝试解决类似的问题(就我而言,我实际上是想继续处理json,但看来您不容易做到)。

无论如何,您都可以使用reader.getPath()获取导致异常的字段的路径。

还基于令牌获得值:JsonToken token = reader.peek(); 还有一个基于令牌值的开关,因此如果是JsonToken.STRING,则使用reader.nextString()来获取该值,依此类推。