2011-03-15 52 views
25

以下问题与我之前询问过的问题有关:Help parsing simple JSON (using JSON for JAVA ME)做JSON密钥需要是唯一的吗?

做的JSON密钥需要是唯一的吗?例如,我遇到了麻烦,解析下面的XML(使用JSON ME):

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

,显然,其由于键必须是唯一的。我只是想知道在所有情况下都是如此。例如,如果我使用的不是JSON ME,我是否可以解析所有这些名称?

谢谢。

+1

[JSON RFC](http://www.ietf.org/rfc/rfc4627.txt)表示“对象中的名称应该是唯一的”,因此实现将有所不同。您可能会发现一个具有更宽松的规则。 – samplebias 2011-03-15 02:15:43

回答

33

如果您使用具有相同名称的多个密钥,但没有“错误”,但在JSON中,具有相同名称的最后一个密钥是将要使用的密钥。

在你的情况下,关键字“name”会更好地包含一个数组,因为它的值,而不是有多个键“name”。同一个对象或“事物”具有两个名称或两个相同的冲突属性没有多大意义。

例如为:

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

您的回答指的是某个特定实施的行为,而不是JSON标准。 – 2017-03-22 19:42:12

3

jQuery能够解析它。但是,如果你尝试访问它,它只是放弃最后一个值。

退房 http://jsfiddle.net/MQmM4/2/

因此,它是可分析的,我想,但如果你使用相同的密钥值被覆盖。

1

这里是使用阵列的可能的解决方案。只是使用数组索引

the_json_array.getJSONObject(0); 


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

RFC 4627

一个目的结构被表示为一对周围零个或多个名称/值对(或成员)大括号 的。名称是 字符串。每个名称后面都会出现一个冒号,并将名称与名称 分开。一个逗号将一个值与以下的名称分开。 对象内的名称应该是唯一的。

+2

RFC4627已经被RFC7159废弃,并且说几乎相同。 35 35 012 012 012 012 012 012 012 – user454322 2014-04-22 03:57:32

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对象基本上是含有键值对一个HashMap中。

这就是为什么每次都会被覆盖的原因。为了避免这种

  1. 要么你必须有唯一的键值
  2. 或者你应该换行键值对个别对象到一个数组

看一看这个JSON Object java implementation到深入了解JSON。