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)
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,您的重复键将作为一个处理。