JSON对象 vs 对象数组

3

我正在查询一个远程服务器并接收JSON响应。响应的格式取决于响应中对象的数量。如果响应中只有一个对象,它看起来类似于:

"results": {
  "meeting": {
    "location": "Location A",
    "time": "1378033200"
  }
}

但如果响应中有多个对象,我将得到一个对象数组:

"results": {
  "meeting": [
    {
      "location": "Location A",
      "time": "1378033200"
    },
    {
      "location": "Location B",
      "time": "1379250000"
    }
  ]
}

服务器完整的响应包括一个“count”变量,因此我可以区分这两种情况。在我的Javascript中,我首先检查计数,如果恰好有一个对象,我会读取类似于位置和时间信息的内容。
var location = results.meeting.location;
var time = results.meeting.time;

如果不止一个对象存在,我会执行以下操作

for(var i=0; i<count; i++) {
  var location = results.meeting[i].location;
  var time = results.meeting[i].time;
}

这个方法可以运行,但我想知道是否有更优雅的方式来处理这两种情况?


1
你能修改JSON响应吗?那将是最优雅的方式。 - Adrian Wragg
3
没问题,你的解析代码没问题。我会把JSON改成始终是一个数组。 - Yotam Omer
2
我同意@YotamOmer的观点。无论其中有多少项,meeting都应该是一个数组。这会为你节省很多麻烦,因为你不必区分两种可能性。这也是更一致的做法。 - basilikum
谢谢您的意见 - 我同意,但不幸的是我无法更改响应。 - Tom
3个回答

5

您可以将其视为数组进行循环,

if(!(results.meeting instanceof Array)){
   results.meeting = [results.meeting];
} 

因此,您将始终获得一个数组,如果是一个带有一个数据的数组

所以之后始终如此

var count = results.meeting.length;
for(var i=0; i<count; i++) {
  var location = results.meeting[i].location;
  var time = results.meeting[i].time;
}

0

处理这种情况的最佳方法是更改您的JSON响应,使meeting始终是一个数组,即使它只有一个条目。如果您无法更新JSON创建的方式,一个简单的方法是使用instanceof进行测试:

if(results.meeting instanceof Array) {
    //array
} else {
   //object
}

0

你可以这样做:

var meetings = result.count ? result.meeting : [result.meeting];

但更好的整体设计肯定是始终首先返回一个数组。


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