我知道这听起来不可能,但是我的老板告诉我,我必须通过一个带有jQuery的AJAX post调用发送一个JSON,它必须有重复键。问题是,如果我写这样的东西:
$.post("someurl", {
"key1" : "value1",
"key2" : "value2",
"key2" : "value3",
"key2" : "value4",
"key3" : "value5"
});
,jQuery将发送请求
someurl?key1=value1&key2=value4&key3=value5
这一切都是因为Javascript会覆盖具有相同名称的属性。 JSON对象是动态生成的,我不允许在其中使用数组。有人能告诉我如何生成JSON对象dinamicaly和重复键?
我真的很感谢你的任何帮助!
答案 0 :(得分:16)
据我所知,{"a": "b", "a": "c"}
根据RFC 4627实际上是有效 JSON。
对象结构表示为一对花括号 包含零个或多个名称/值对(或成员)。名字是 串。每个名称后面都有一个冒号,分隔名称 从价值。单个逗号将值与后续值分开 名称。对象应该中的名称是唯一的。
......应该在哪里:
3。应该。这个词,或形容词“推荐”,意思是那里 在特定情况下可能存在有效理由忽略a 特殊项目,但必须理解全部含义 在选择不同的课程之前仔细权衡。
所以是的,基本上你可以这样做,它是合法的,但这也是一个坏主意。不同的JSON解码器可能会以不同的方式和/或以不可分割的方式处理这种情况。看看规范对解析器的要求:
JSON解析器将JSON文本转换为另一种表示形式。一个 JSON解析器必须接受符合JSON语法的所有文本。 JSON解析器 MAY 接受非JSON表单或扩展。
实施可能设置对其文本大小的限制 接受。实施可能设置最大深度限制 筑巢。实施可能设置数字范围的限制。 实施可能设置长度和字符内容的限制 字符串。
...但是实现并没有 来处理这样的情况。例如:
# Python 2.7
>>> import json
>>> json.JSONDecoder().decode('{"a": "b", "a": "c"}')
`{u'a': u'c'}`
# Chrome 32
> JSON.parse('{"a": "b", "a": "c"}')
Object {a: "c"}
...和其他实现可能合法地给你(用Python表示法):
{"a": "b"}
[("a", "b"), ("a", "c")]
[("a", ["b", "c"])]
[]
42
"your JSON is bad and you should feel bad"
......或者只是好老nasal daemons。从字面上看,JSON解析器在这里做的唯一非法事情是引发异常。
您希望在生产代码中做的最后一件事就是依赖于奇怪的边案例。所以你要做的最后一件事是行使你的权利,形成名义上合法但实际上无用的JSON。如果你想这样做,你必须手工完成 - 为任何可能想要使用你的数据的人建立你自己的抽象语法树,你自己的解析器,你自己的生成器,生成器......
答案 1 :(得分:3)
具有重复键的Javascript对象不是Javascript对象。事实上,它只不过是你想象中的一个虚构。这完全不可能。
执行此操作的唯一方法是使用数组:
{
"key1" : "value1",
"key2" : ["value2", "value3", "value4"],
"key3" : "value5"
}
jQuery会将其转换为key1=value1&key2%5B%5D=value2&key2%5B%5D=value3&key2%5B%5D=value4&key3=value5
这确实是实现此目的的唯一方法。*您的代码无法生成有效的JSON吗?
*除了编写自己的解析器来处理无效的JSON之外。但那将是令人惊讶的愚蠢。
答案 2 :(得分:0)
只有当另一方的JSON解析器正确接受它而不丢弃任何内容时,我才会这样做。如果您可以显示它丢弃的东西,那么您可以寻找另一种解决方案(例如使用数组,或手动生成JSON,或正确使用URL。您需要首先为您的服务器提供更好的测试用例。
答案 3 :(得分:0)
如果您无法在源位置更改源代码,请将源代码更改为至少可以使用的内容...
将JSON解析为键值对数组(而不是键/值对的对象)。
如果您可以访问JSON字符串,只需将所有“,”替换为“},{”并将结果包装在“[”和“]”中,就可以轻松完成此操作。
您现在拥有一个有效的JSON数组键/值对,这是javascript合法的。