【问题标题】:json object vs array of objectsjson对象与对象数组
【发布时间】:2013-07-16 11:47:41
【问题描述】:

我正在查询远程服务器并收到 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;
}

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

【问题讨论】:

  • 你能改变 JSON 响应吗?那将是最优雅的方式。
  • 是的,你的解析代码没问题。我会将 JSON 更改为始终是一个数组。
  • 我同意@YotamOmer。 meeting 应该始终是一个数组,即使其中只有一个甚至零个项目。这将为您省去很多麻烦,因为您不必区分两种可能性。这也是更一致的方式。
  • 感谢您的意见 - 我同意,但很遗憾我无法更改回复。

标签: javascript jquery arrays json object


【解决方案1】:

你总是可以将它作为一个数组循环,

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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以这样做:

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

      但更好的整体设计当然是首先总是返回一个数组。

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 2015-11-13
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2011-12-02
        • 2012-05-28
        相关资源
        最近更新 更多