通过Jackson进行JSON重复属性验证

3
我使用Jackson并想检查输入的JSON字符串是否包含重复的属性,例如:{"a" : 1, "a" : 0}。以下是Jackson片段处理输入字符串而不会出现任何错误,甚至返回值:JsonNode jsonSelect = mapper.readTree("{ A : 1, A : 0}"); System.out.println(jsonSelect.getFieldValue("A")); // prints 0。我有机会通过Jackson验证重复吗?顺便问一下,JSON格式是否支持重复的属性?我在specification中没有找到任何关于此的限制。此外,org.json.JSONObject对重复项抛出异常,这并没有给我一个答案 - {"a" : 1, "a" : 0} 是否符合标准。
2个回答

3

JSON规范表明重复的属性不被视为有效,但解析器不需要对此做任何处理。从实际角度来看,跟踪所有已看到的属性会增加开销,在流式解析器级别可能没有意义。

至于Jackson,在数据绑定级别曾经具有重复检测功能,但我认为目前未启用。在处理Maps时可以很容易地添加这个功能。 如果您需要这个功能,提交一个功能请求或在用户列表上询问可能是有意义的(特别是要查看其他人是否也需要此功能,以便更有可能很快添加)。

如果您只想进行验证,可以创建一个Map子类,在重复时抛出异常。或者,只需在子类中设置一个标志,您可以在需要时进行检查。


0

JSON不支持重复属性。因此,如果您的输入保证为有效的JSON,则无需检查它们。


不,我的输入并不能保证JSON是有效的。 - Raman
规范中说它是不正确的JSON格式?在json.org上没有找到这样的限制。 - Raman
JSON基于JavaScript对象字面语法。JavaScript对象是一组命名值(“属性”)。如果您想将许多值与一个名称关联起来,则可以使用数组值属性:{"a": [1, 0]}。支持重复属性名称的JavaScript有点像Java支持重复实例变量名称。 - Jim Ferrans
在最新版的Chrome中,JSON.parse('{"a": true,"a": true}') 返回 Object {a: true}。虽然这是无效的JSON格式,但本地的JSON解析并没有捕获到错误,因此你需要进行检查。 - wheresrhys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接