小编典典

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

ajax

我知道这听起来是不可能的,但是我的老板告诉我,我必须通过jQuery的AJAX发布调用发送JSON,并且必须具有重复的键。问题是,如果我写这样的话:

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

,jQuery会将请求发送为

someurl?key1=value1&key2=value4&key3=value5

所有这些都是因为Javascript会覆盖具有相同名称的属性。JSON对象是动态生成的,不允许在其中使用数组。有人可以告诉我如何生成具有重复键的JSON对象吗?

非常感谢您的帮助!


阅读 309

收藏
2020-07-26

共1个答案

小编典典

据我所知{"a": "b", "a": "c"}实际上是根据RFC
4627的
有效 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"}

…以及其他实现可能会合法地给您(以Python表示法):

  • {“ a”:“ b”}

  • [(“ a”,“ b”),(“ a”,“ c”)]

  • [(“ a”,[“ b”,“ c”])]

  • []

  • 42

  • “您的JSON不好,您应该感到难受”

…或者只是好的旧式鼻部守护程序。从字面上看,JSON解析器在这里所​​做的唯一非法的事情就是引发异常。

您在生产代码中要做的最后一件事是依靠怪异的情况。因此,您要做的最后一件事是行使您的权利,以形成名义上合法但实际上无用的JSON。如果要执行此操作,则必须手动进行-
建立自己的抽象语法树,自己的解析器,自己的生成器,为任何可能想要使用您的数据的人生成器…

2020-07-26