我有以下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"}
答案 0 :(得分:3)
直接回答您的问题:
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()
解析它),那么您将无法获得具有该类型的重复键数据声明作为同一密钥的后续声明可能只是替换先前的声明 - 只有一个将存活。
您可能需要一些不同类型的数据结构,例如数组或具有键的数组值的对象:
这是一个数组,它只是成对地在键和值之间交替出现:
[
"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 :(得分:1)
JSON字符串的每个键必须是唯一的,否则当您将其解析为javascript对象时,它将被最新的键实例覆盖。
答案 2 :(得分:1)
JSON是Javascript(ECMAScript)的子集,Javascript中的对象文字被评估为对象创建,后跟属性赋值,因此允许重复的属性名称,但最后一个重复项覆盖前一个。
此外,如果你要在Javascript中解析一个对象的JSON表示并保留重复的名称,你需要将结果表示为Javascript对象以外的东西,这是不切实际的。