Make Gson在使用重复键解析JSON时抛出异常

amo*_*fis 10 java parsing json gson

我正在用Gson解析简单的JSON对象.我希望它在重复密钥名称时抛出一些错误.例如

{
  a: 2,
  a: 3
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,Gson解析这样的JSON并将a设置为3.我希望它抛出一些异常.

我知道我可以将JSON解析为map,然后Gson会在这种情况下抛出异常,但前提是复制的键没有嵌套在map中.如果我有像这样的JSON:

{
  a: 2,
  b: {
    dup: 1,
    dup: 2
  }
}
Run Code Online (Sandbox Code Playgroud)

仍然,它被解析没有任何异常,我只有一个值为2的"dup".

我可以以某种方式设置Gson在这种情况下抛出错误吗?或者在JsonObject实例中有重复的条目,以便我自己可以检测到它(但我怀疑它,因为它会无效JsonObject)

可重复的例子

String json = "{\"a\":2, \"a\":3}";
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
System.out.println(jsonObject);
Run Code Online (Sandbox Code Playgroud)

打印出来

{"a":3}
Run Code Online (Sandbox Code Playgroud)

Dev*_*rim 6

1)您可以稍微编辑一下gson的来源。这只是了解事情如何运作的建议。我不建议您在真实/生产环境中使用它。

Gson 使用com.google.gson.internal.LinkedTreeMap同时将 json 字符串解析为JsonObject. 对于测试问题,您可以将该类复制到具有相同名称和包名称的项目中。并编辑其 put 方法以不允许重复键。

    @Override
    public V put(K key, V value) {
    if (key == null) {
      throw new NullPointerException("key == null");
    }

    // my edit here
    if(find(key, false) != null) {
        throw new IllegalArgumentException("'" + key.toString() + "' is duplicate key for json!");
    }

    Node<K, V> created = find(key, true);
    V result = created.value;
    created.value = value;
    return result;
  }
Run Code Online (Sandbox Code Playgroud)

2)另一个干净的解决方案是定义将映射到您的json字符串的自定义类。然后编写他们的自定义TypeAdapters

3)通过使用解串器来做吗?我不认为这是可能的。如果您尝试使用它,您会看到那里已经有一个 jsonObject,您的重复键将作为一个处理。