2015-09-07 58 views
1

我正在努力使用Nest API及其对结构的JSON响应。我想要一个结构对象列表,但是Nest做了多个名为结构ID的属性。对我来说,看起来实施这个的人完全误解了如何使用JSON。我希望能够让Nest API返回更合理的JSON结构。有什么方法可以从Nest获得更多对列表友好的JSON repsonse?如果是这样,怎么样?将巢结构作为一个列表?

这是鸟巢如何返回结构:

{ 
    "structures": { 
     "VqFabWH21nwVyd4RWgJgNb292wa7hG_dUwo2i2SG7j3-BOLY0BA4sw": { 
      "structure_id": "VqFabWH21nwVyd4RWgJgNb292wa7hG_dUwo2i2SG7j3-BOLY0BA4sw", 
      "thermostats": [ 
       "peyiJNo0IldT2YlIVtYaGQ" 
      ], 
      "smoke_co_alarms": [ 
       "RTMTKxsQTCxzVcsySOHPxKoF4OyCifrs" 
      ], 
      "devices": {}, 
      "away": "home", 
      "name": "Home", 
      "country_code": "US", 
      "postal_code": "94304", 
      "peak_period_start_time": "2015-10-31T23:59:59.000Z", 
      "peak_period_end_time": "2015-10-31T23:59:59.000Z", 
      "time_zone": "America/Los_Angeles", 
      "eta": {}, 
      "wheres": { 
       "Fqp6wJI...": { 
        "where_id": "Fqp6wJI...", 
        "name": "Bedroom" 
       } 
      } 
     } 
    } 
} 

这是我想得相反:

{ 
    "structures": [ 
     { 
      "structure_id": "VqFabWH21nwVyd4RWgJgNb292wa7hG_dUwo2i2SG7j3-BOLY0BA4sw", 
      "thermostats": [ 
       "peyiJNo0IldT2YlIVtYaGQ" 
      ], 
      "smoke_co_alarms": [ 
       "RTMTKxsQTCxzVcsySOHPxKoF4OyCifrs" 
      ], 
      "devices": [], 
      "away": "home", 
      "name": "Home", 
      "country_code": "US", 
      "postal_code": "94304", 
      "peak_period_start_time": "2015-10-31T23:59:59.000Z", 
      "peak_period_end_time": "2015-10-31T23:59:59.000Z", 
      "time_zone": "America/Los_Angeles", 
      "eta": {}, 
      "wheres": [ 
       { 
        "where_id": "Fqp6wJI...", 
        "name": "Bedroom" 
       } 
      } 
     ] 
    } 
} 
+0

没有什么不对的地方,这就是所谓的关联数组。之前也有人问过,例如这里:http://stackoverflow.com/questions/6047460/how-to-loop-through-an-json-associative-array-in-javascript细节取决于你的编程环境 –

+0

“它没有错”。也许。但是,你能向我解释一下在哪种情况下使用关联数组是合理的吗?在这种情况下,非常清楚的是,它使用的是完全相同类型的对象,并且数据在列表中是有意义的。为什么有人会使用关联数组而不是使用列表? –

+0

@ThomasClemensen您可以在一个对象上进行O(1)查找,这个查找包含一个与顺序无关的唯一标识数据(该结构对象不是)。在视图中执行id并将其细节与原始对象的单一副本进行协调,而无需遍历数组或在原始数据结构上保留顺序。无论哪种方式JSON旨在通过对象定义来表示关联数组,因此它本身不是“错误的”。 –

回答

2

没有什么不对的JSON,你看到了什么叫做associative array ,这是一种收集形式,就像数组,列表或集合一样。在JSON中,关联数组可以表示为对象{}。这是一个非常基本的数据结构,以许多名称而闻名,包括Map或Dictionary,取决于所使用的编程语言。

是否使用关联数组或列表很大程度上取决于您希望访问项目的方式。它与存储在集合中的对象的类型没有任何关系。

通常,如果您想通过键值和“普通”数组/列表访问项目(如果要按位置访问项目),通常会使用关联数组。如果项目的顺序很重要,“常规”数组/列表通常也会更好,而关联数组通常不会被排序(尽管它们可能取决于实现细节)。

大多数编程环境允许您迭代关联数组的键值列表,从而允许类似访问“普通”数组/列表。

下面是在JavaScript一个简单的例子:

var c; 
c = [1, 2]; // ordinary array 
c[0]; // access by position 

var i; 
for (i = 0; i < c.length; ++i) { // loop through all items and ... 
    console.log(c[i]); // access by position 
} 

c = {"key1": 1, "key2": 2}; // associative array 
c.key2; // access by key 

var key; 
for (key in c) { // iterate over all keys and ... 
    console.log(c[key]); // access by key value 
} 
相关问题