Jquery JSON解析多密钥

Jquery JSON解析多密钥,jquery,json,Jquery,Json,我有以下JSON字符串 var jsonString = '{"J":4,"0":"M", "J":5,"0":"N"}' 如果我使用jquery.parseJSON(jsonString)解析它,我会得到 问题 1) jsonString的格式是否错误 2) 是否还有另一种jquery方法可以用于包含具有重复键的对象,即 jquery.someAwesomeMethod(jsonString) => {"J":4,"0":"M", "J":5,"0":"N"} JSON字符串的每个键

我有以下JSON字符串

var jsonString = '{"J":4,"0":"M", "J":5,"0":"N"}'
如果我使用jquery.parseJSON(jsonString)解析它,我会得到

问题

1) jsonString的格式是否错误

2) 是否还有另一种jquery方法可以用于包含具有重复键的对象,即

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

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

要直接回答您的问题:

1) Is jsonString malformed?
它实际上可能是合法的JSON(我不完全确定),但在任何类型的javascript上下文中使用,或者在使用任何javascript JSON解析器(如
jquery.parseJSON
)解析时,它都不实用,因为键重复

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()
解析JSON),这种类型的数据声明不会得到重复的密钥,因为同一密钥的后续声明很可能只会替换早期的声明—只有一个会继续存在

您可能需要一些不同类型的数据结构,例如数组或具有键数组值的对象:

以下是一个数组,它在键和值之间成对交替:

[
    "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

每个键都会包含一个值数组。

JSON是Javascript(ECMAScript)的子集,Javascript中的对象文本被计算为对象创建,然后是属性赋值,因此允许重复属性名,但最后一个重复的属性名会覆盖上一个属性名


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

如何访问此JSON的数据?给定代码
obj.J
您希望它的计算结果是什么?在您的示例中,
jsonString
是一个JavaScript对象,而不是JSON字符串。没有理由调用
jquery.parseJSON(jsonString)
。正如其他人已经说过的,对象属性名称在JS中是唯一的。@Felix King:Woops,它应该在单引号中。我已经编辑了post.JSON!=JavaScript对象。我可以在一个JSON字符串中拥有任意多个同名键,而不会让前面的键神奇地消失。只有将JSON解析为JavaScript对象时,才会覆盖重复的键(在JavaScript对象中)。@Felix——当您像OP一样将其转换为JavaScript对象时,键会相互覆盖。JavaScript!=JSON,所以javascript所做的只是在使用javascript中的JSON时感兴趣。规范没有说明应该用多个键做什么,尽管从实现的角度来看,“最后一个赢”是一个常见的选择。@StaxMan-这个问题是关于从Javascript使用JSON的。他们特别询问如何使用
jquery.parseJSON()
,我就是这样回答的。否。JSON没有被定义为Javascript的子集(参见规范),尽管在实践中它可以被视为Javascript的子集。但记住这一区别很重要,因为否则人们可能会认为行为会遵循JS规范,而事实并非如此。相反,这种情况下的行为是严格未定义的。@StaxMan:更具体地说,JSON“基于JavaScript编程语言的一个子集”。如果您不依赖Javascript规范,那么还有很多未定义的内容……是的,在JS的使用之外,还有很多未定义的内容。但既然这个问题是在JS中使用的,我想这就足够公平了。
{"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