在JSON.org上,JSON表示的基本数据结构以
的形式给出我无法在任何地方找到与已经解析为当前对象的名称相同的第二个成员是否应该(a)抛出异常或(b)替换现有成员。
这是指定的吗?
现有的解析器对重复的名称做了什么?
编辑:我希望为我的解析器定义正确的行为。
答案 0 :(得分:3)
JSON只是JavaScript的对象文字符号的一个子集,因此受到相同规则的约束 - 重复键的最新值将覆盖特定对象中该键的任何先前分配的值。考虑为对象属性赋值;稍后的分配将覆盖之前的分配。
为了证明这一点,我设置了一个example here。代码显示在页面上,可以看到,消息框中的名称为“Barney”。
代码 -
$(function() {
$('#myButton').click(function(e)
{
var myJsonString = "Person = {'firstName':'Fred','lastName':'Flintstone','firstName':'Barney'}";
eval("(" + myJsonString + ")");
alert(Person.firstName);
});
});
顺便说一下,我在这里使用了eval()以方便使用。由于安全问题,我建议使用JSON解析器而不是eval()。
答案 1 :(得分:1)
解析器找到的姓氏被新的替换。它不会引起任何考验。
它只是一个Javascript语法的东西。
var json = {};
// lets augment the object
json.one = 1;
json.one = 2; // it gets replaced
答案 2 :(得分:0)
我很确定您列出的这两种行为都会被接受,以及其他行为(使用第一种行为,使用其中任何行为)。 :-) 也就是说,这种行为在JSON规范POV中是未定义的。
作为一个实际问题,我使用的实现做了你提到的建议之一,或“使用第一个”。
所以不,我不会指望具体的行为,因为工具可以选择做什么。
答案 3 :(得分:-1)
因为JSON只是Javascript的一个子集,所以它在很大程度上取决于Javascript规范。我个人不知道答案是什么,但我强烈建议不要依赖这种行为。