如何使用重复键动态生成JSON对象?

Raz*_*aru 10 javascript ajax jquery json

我知道这听起来不可能,但是我的老板告诉我,我必须通过一个带有jQuery的AJAX post调用发送一个JSON,它必须有重复键.问题是,如果我写这样的东西:

$.post("someurl", {
     "key1" : "value1",
     "key2" : "value2",
     "key2" : "value3",
     "key2" : "value4",
     "key3" : "value5"
});
Run Code Online (Sandbox Code Playgroud)

,jQuery将发送请求为

someurl?key1=value1&key2=value4&key3=value5
Run Code Online (Sandbox Code Playgroud)

这一切都是因为Javascript会覆盖具有相同名称的属性.JSON对象是动态生成的,我不允许在其中使用数组.有人能告诉我如何生成JSON对象dinamicaly和重复键?

我真的很感谢你的任何帮助!

bad*_*adp 16

根据我所看到的,根据RFC 4627,{"a": "b", "a": "c"}实际上是有效的 JSON .

对象结构表示为围绕零个或多个名称/值对(或成员)的一对花括号.名称是一个字符串.每个名称后面都有一个冒号,将名称与值分开.单个逗号将值与以下名称分隔开.对象中的名称应该是唯一的.

......应该在哪里:

3.应该.这个词,或形容词"推荐",意味着在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡全部含义.

所以,是的,基本上你可以做到这一点,这是合法的,但这也是一个坏主意.不同的JSON解码器可能会以不同的方式和/或以不可分割的方式处理这种情况.看看规范对解析器的要求:

JSON解析器将JSON文本转换为另一种表示形式.JSON解析器必须接受符合JSON语法的所有文本.JSON解析器可以接受非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"}
Run Code Online (Sandbox Code Playgroud)

...和其他实现可能合法地给你(用Python表示法):

  • {"a": "b"}
  • [("a", "b"), ("a", "c")]
  • [("a", ["b", "c"])]
  • []
  • 42
  • "your JSON is bad and you should feel bad"

......或者只是好老的鼻子守护进程.从字面上看,JSON解析器在这里做的唯一非法事情是引发异常.

您想要在生产代码中做的最后一件事就是依赖于奇怪的边案例.所以你要做的最后一件事是行使你的权利,形成名义上合法但实际上无用的JSON.如果你想这样做,你必须手工完成 - 为任何可能想要使用你的数据的人建立你自己的抽象语法树,你自己的解析器,你自己的生成器,生成器......

  • 这是一个很好的答案,但忽略了这个问题实际上并不是关于 JSON 的事实...... (2认同)
  • @lonesomeday如果你相信,那么这个问题需要一些清理.我首先偶然发现这个问题的全部原因是通过Google搜索JSON对象是否可以有重复键 - 这个问题的答案肯定是"是". (2认同)