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

时间:2013-06-12 10:31:37

标签: javascript jquery ajax json

我知道这听起来不可能,但是我的老板告诉我,我必须通过一个带有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和重复键?

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

4 个答案:

答案 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合法的。