我使用 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,但在这种情况下似乎不合适。
答案 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:131
和ReflectiveTypeAdapterFactory.java:222
都不会将他们处理的字段传播到抛出异常。这看起来像一个问题,似乎值得向Gson提交错误报告。
答案 1 :(得分:0)
我正在尝试解决类似的问题(就我而言,我实际上是想继续处理json,但看来您不容易做到)。
无论如何,您都可以使用reader.getPath()获取导致异常的字段的路径。
还基于令牌获得值:JsonToken token = reader.peek(); 还有一个基于令牌值的开关,因此如果是JsonToken.STRING,则使用reader.nextString()来获取该值,依此类推。