JSON解析多个键

3
我有以下JSON字符串。
var jsonString = '{"J":4,"0":"M", "J":5,"0":"N"}'

如果我使用jquery.parseJSON(jsonString)进行解析,我会得到:
{"J":5,"0":"N"}

问题

1)jsonString是否格式不正确?

2)是否有另一种jquery方法可以包含具有重复键的对象,例如:

jquery.someAwesomeMethod(jsonString) => {"J":4,"0":"M", "J":5,"0":"N"}

1
你打算如何访问这个JSON的数据? - Cokegod
2
给定代码 obj.J,你期望它会评估为什么? - ChaosPandion
在你的例子中,jsonString 是一个 JavaScript 对象,而不是 JSON 字符串。没有理由调用 jquery.parseJSON(jsonString)。正如其他人已经说过的那样,在 JS 中,对象属性名是唯一的。 - Felix Kling
@Felix King:糟糕,应该用单引号。我已经编辑了帖子。 - Ken Hirakawa
3个回答

3
回答你的问题:

直接回答你的问题:

1) Is jsonString malformed?

这可能是合法的JSON(我不完全确定),但由于存在重复键,在任何JavaScript上下文中使用或使用像jquery.parseJSON这样的JavaScript JSON解析器进行解析时都不实用。

2) Is there another jquery method I can use to include objects 
   with duplicate keys, i.e.

jquery.someAwesomeMethod(jsonString) => {"J":4,"0":"M", "J":5,"0":"N"}

很抱歉,没有这样的jQuery方法,因为jQuery本身没有这个功能,并且你所需的输出在JavaScript中也不可能实现。您已经表示了JavaScript对象语法,但是JavaScript对象不支持重复键。在JavaScript中,给定键的最后一个设置值将获胜。
因此,如果您打算将JSON解析为普通的JavaScript对象(这是浏览器应用程序通常使用JSON的方式,并且可以使用jquery.parseJSON()进行解析),则不会使用该类型的数据声明获取重复键,因为稍后相同键的声明很可能只会替换先前的声明-只有一个将存活下来。
您可能需要一些不同类型的数据结构,例如数组或具有键的数组值的对象:
这是一个仅在成对的键和值之间交替的数组:
[
    "J", 4, 
    "0","M", 
    "J", 5, 
    "0","N"
]

obj[0] // key
obj[1] // corresponding value

访问数组时,偶数索引将作为键,奇数索引将作为值。

或者这里有一个对象,其中值是数组,因此您可以在每个键上拥有多个值:

{"J":[4, 5], "0":["M", "N"]}

typeof obj["J"]  // Array
obj["J"].length  // array of length == 2
obj["J"][0]      // first value in array == 4
obj["J"][1]      // second value in array == 5

每个键都将保存一个值数组。

1
JavaScript != JSON,因此只有在使用 JavaScript 来处理 JSON 数据时才会关注 JavaScript 的功能。规范并未说明应如何处理多个键,尽管从实现的角度来看,“最后一个获胜”是一种常见的选择。 - StaxMan
@StaxMan - 这个问题特别涉及到在JavaScript中使用JSON。他们明确提出了如何使用jquery.parseJSON(),这就是我在回答中解决的方法。 - jfriend00

1

JSON字符串的每个键必须是唯一的,否则当您将其解析为javascript对象时,最新的键实例会覆盖先前的键实例。


2
JSON不等于JavaScript对象。在JSON字符串中,我可以有任意多个相同名称的键,而不会神奇地使之前的键消失。只有将JSON解析为JavaScript对象时,重复的键才会被覆盖(在JavaScript对象中)。 - Felix Kling
@Felix -- 当你像OP一样将它转换为JavaScript对象时,键会相互覆盖。 - Naftali

1

JSON是Javascript的一个子集(ECMAScript),而在Javascript中,对象文字被评估为对象创建后跟属性赋值,因此允许重复的属性名称,但最后一个副本将覆盖之前的。

此外,如果您要解析Javascript对象的JSON表示并保留重复的名称,则需要将结果表示为其他类型的Javascript对象,这是不切实际的。


1
不,JSON并非定义为JavaScript的子集(请参阅规范),尽管在实践中可以这样看待。但是重要的是要记住这种区别,否则可能会认为行为将遵循JS规范,但实际上并非如此。相反,在这种情况下的行为是严格未定义的。 - StaxMan
@StaxMan:更具体地说,JSON“基于JavaScript编程语言的子集”。如果不依赖JavaScript规范,那么还有很多未定义的内容... - Guffa
是的,在JS之外,有很多东西是未定义的。但既然这个问题是为在JS中使用而设计的,我想这是公平的。 - StaxMan

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