JSON键需要唯一吗?

40

以下问题与我之前提出的问题有关:帮助解析简单的JSON(使用JSON for JAVA ME)

JSON的键是否需要唯一?例如,我在使用JSON ME解析以下XML时遇到了麻烦:

{
  "name" : "JACK",
  "name" : "JILL",
  "name" : "JOHN",
  "name" : "JENNY",
  "name" : "JAMES",
  "name" : "JIM"
}

显然,这是因为键必须是唯一的。 我只是想知道在所有情况下是否都是如此。例如,如果我使用的不是JSON ME,那么我能解析所有这些名称吗?

谢谢。


2
JSON RFC指出:“对象中的名称应该是唯一的”,因此实现会有所不同。你可能会发现某些实现具有更宽松的规则。 - samplebias
5个回答

51

如果您在JSON中使用多个具有相同名称的键,则不会出现“错误”,但是最后一个具有相同名称的键将被使用。

在您的情况下,“name”键最好包含一个数组作为其值,而不是拥有一些命名为“name”的键。同一对象或“事物”拥有两个名称或具有冲突的相同属性并没有太多意义。

例如:

{
  "name" : [ "JOHN", "JACK", "...", ... ]
}

3
你的答案涉及到一个具体实现的行为,而不是 JSON 标准。 - Karol S
3
但在JSON中,具有相同名称的最后一个键将被使用。参考资料是什么? - Koray Tugay

34

来自RFC 4627

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


5
RFC4627已被RFC7159取代,并且两者几乎相同。 - user454322

5

jQuery能够解析它。但是,如果你试图访问它,它只会返回最后一个值。

请查看http://jsfiddle.net/MQmM4/2/

因此,我猜它是可解析的,但如果你使用相同的键,值将被覆盖。


4

以下是一种使用数组的可能解决方案。只需使用数组索引即可。

the_json_array.getJSONObject(0);


{"nameList":
[{"name" : "JACK"},
{"name" : "JILL"},
{"name" : "JOHN"},
{"name" : "JENNY"},
{"name" : "JAMES"},
{"name" : "JIM"}]}

1
一个 JSON 对象看起来像下面这样:

public JSONObject(Map<?, ?> map) {
    this.map = new HashMap<String, Object>();
    if (map != null) {
        for (final Entry<?, ?> e : map.entrySet()) {
            final Object value = e.getValue();
            if (value != null) {
                this.map.put(String.valueOf(e.getKey()), wrap(value));
            }
        }
    }
}

一个JSON对象基本上是一个包含键值对的哈希表。
这就是为什么每次都会被覆盖。为了避免这种情况,
  1. 要么你必须有唯一的键值
  2. 要么你应该将键值对作为单独的对象封装到一个数组中
查看这个JSON对象Java实现以深入了解JSON。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接