我正在使用Gson在我的Android应用程序中解析JSON。说我要解析这个json:
{
"foo": 01
}
现在,根据Json规范ECMA-404:
数字在基数10中表示,没有多余的前导零[...]
表示无效中的json。不幸的是,Gson由于某些原因没有实现这一点,并且foo
String
为"01"
foo
。在解析时,我无法判断原始值是字符串,还是格式错误的数字。
当我从isString
收到JsonPrimitive时,方法JsonSyntaxException
返回true。它应该抛出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的项目公开问题,但对此却一无所知。
有没有办法检测这种错误的语法?
这是对我有用的代码:
{{1}}
答案 0 :(得分:2)
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。