我正在使用 Gson 在 Android 应用程序中解析 JSON。假设我想解析这个 json:
{
"foo": 01
}
现在,根据 Json 规范 ECMA-404 :
A number is represented in base 10 with no superfluous leading zero [...]
意味着上面的json无效。不幸的是,由于某种原因,Gson 没有实现这一点,并为我提供了 foo
作为 String
"01"
。解析时,我无法判断原始值是字符串还是格式错误的数字。
当我从 foo
收到 JsonPrimitive 时,isString
方法返回 true。它应该抛出一个 JsonSyntaxException
。
我尝试过 gson 的自定义反序列化,但没有成功。我在网上到处搜索,甚至浏览了 Gson 的项目 open issues,但没有找到任何相关内容。
有没有办法检测这种类型的错误语法?
编辑
这是对我有用的代码:
private class Bar implements Serializable {
private static final long serialVersionUID = 1L;
@Expose
@SerializedName("foo")
private String foo;
}
public static void main(String[] args) throws Exception {
String json = "{\"foo\" : 01}";
Gson gson = new GsonBuilder().create();
Bar bar = gson.getAdapter(Bar.class).fromJson(json);
}
最佳答案
Gson
默认情况下以宽松模式解析。您可以使用
gson.getAdapter(type).fromJson(json);
以严格模式解析。例如
public static void main(String[] args) throws Exception {
String json = "{\"value\" : 01}";
Gson gson = new GsonBuilder().create();
System.out.println(gson.getAdapter(Value.class).fromJson(json));
}
static class Value {
Integer value;
public String toString() {
return "" + value;
}
}
抛出
Exception in thread "main" com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:589)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:414)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:234)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:231)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:256)
at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:269)
at com.example.Example.main(Example.java:21)
这已被讨论here .
关于java - 绕过 Gson 数字解析器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25273485/