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

Javascript 如何使用重复的键动态生成JSON对象?,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我知道这听起来是不可能的,但我的老板告诉我,我必须使用jQuery通过AJAX post调用发送JSON,该调用必须具有重复的键。问题是如果我写这样的东西: $.post("someurl", { "key1" : "value1", "key2" : "value2", "key2" : "value3", "key2" : "value4", "key3" : "value5" }); ,jQuery将以 someurl?key1=valu

我知道这听起来是不可能的,但我的老板告诉我,我必须使用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对象和重复的键吗


我真的非常感谢你的帮助

具有重复键的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。但那将是惊人的愚蠢。

从我所看到的来看,
{“a”:“b”,“a”:“c”}
实际上是有效的JSON

对象结构表示为一对花括号 围绕零个或多个名称/值对(或成员)。一个名字就是一个名字 一串每个名称后面都有一个冒号,用于分隔名称 从价值上来说。一个逗号将一个值与后面的值分隔开 名称对象中的名称应该是唯一的

……这意味着:

三,。应该这个词或形容词“推荐”的意思是 在特定情况下,可能存在忽略 特定项目,但必须理解和理解其全部含义 在选择不同的课程之前仔细权衡

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

JSON解析器将JSON文本转换为另一种表示形式。A. 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。如果你想这样做,你必须手工完成——构建你自己的抽象语法树,你自己的解析器,你自己的生成器,为任何想使用你的数据的人生成的生成器…

我只会在另一端的JSON解析器正确地接受它的情况下做,而不会删除任何内容。如果您可以显示它删除内容,那么您可以寻找另一种解决方案(例如使用数组、手动生成JSON或正确使用URL。您首先需要为您的服务器提供更好的测试用例。

如果您无法在源代码处更改源代码,那么请将源代码更改为至少可以使用的内容

将JSON解析为键值对数组(而不是键值对对象)

如果您可以访问JSON字符串,只需将all替换为“},{”,并将结果包装为“[”和“]”,就可以轻松地完成这项工作


您现在有了一个有效的JSON键/值对数组,该数组是javascript合法的。

。询问您的老板是否希望您在使用时购买左手画笔。如果jQuery以
someurl?key1=value1&key2=value4&key3=value5
的形式发送数据,则它不会发送JSON。如果查询字符串是需要包含多个字符的最终结果使用相同的键,然后不要使用不允许的api创建它。只需使用任何合适的日期结构(例如json+数组)自己构建它.Btw,你真的想创建JSON还是一个对象?只是把术语弄清楚..这是我听说过的最愚蠢的要求之一,你的工作一定很难…我知道,但我的老板告诉我要找到一种方法,用重复的键生成JSON对象。我告诉他这不可能,但他不感兴趣!@Razvan CatalinOlaru让他画一个两边的三角形!这是个好主意!使用
$.param(输入,true)
将导致:
key1=value1&key2=value2&key2=value3&key2=value4&key3=value5
,这可能更适合给出需求。这是一个很好的答案,但忽略了一个事实,即问题实际上不是关于JSON的…@lonesomeday AFAICT URL的查询部分是及其
key=value&key=value
结构e主要是惯例,因此
?a=b&a=c
仍然是合法的。因此,从JSON到URL的转换不会是荒谬或不可能的,但肯定不会通过标准组件免费获得。关键是Javascript对象文本可能有重复的键,JSON可能有重复的键,HTTP查询可能有重复的键没有钥匙,但是 {"a": "b"} [("a", "b"), ("a", "c")] [("a", ["b", "c"])] [] 42 "your JSON is bad and you should feel bad"