java - 绕过 Gson 数字解析器实现

标签 java android json gson

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

相关文章:

java - 连接池不适用于通过 UCP 的 DB2 数据库

Java - JFrame 中的计算器 - 除法不起作用?

android - 如何设置按钮的xml布局

android - 在 MVVM 中处理昂贵的、特定于 View 的对象的最佳实践

java - 将 Java 对象转换为 Java Map<String,Object>

javascript - 如果 JSON 对象不存在,则将其添加到该对象中

java - 使用 Restful Service(端点)或带有应用程序引擎的 servlet 哪个更可取?

java - 使用 Mockito 从链式方法中捕获参数

java - 每当我单击“后退”/“主页”按钮时,代码的asynctask部分就会关闭/停止该应用程序

asp.net - JqG​​rid 在 ASP.NET MVC2 中不起作用