绕过Gson数解析器实现

时间:2014-08-12 20:26:17

标签: java android json gson

我正在使用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}}

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