2

我已经向 freebase API 发出请求,查询是:

{
  "id" : "/m/01f8mn",
  "key" : [{
    "namespace" : "/wikipedia/en_id",
    "value" : null
  }],
  "key" : [{
    "namespace" : "/authority/mobygames/game",
    "value" : null
  }]  
}​

我从 Freebase 得到了答案:

{
  "code":          "/api/status/ok",
  "result": {
    "id": "/m/01f8mn",
    "key": [{
      "namespace": "/wikipedia/en_id",
      "value":     "213502"
    }],
    "ns0:key": [{
      "namespace": "/authority/mobygames/game",
      "value":     "prince-of-persia"
    }],
    "ns1:key": [{
      "namespace": "/authority/giantbomb/game",
      "value":     "61-2561"
    }]
  },
  "status":        "200 OK",
  "transaction_id": "cache;cache03.p01.sjc1:8101;2012-05-20T18:37:04Z;0060"
}

如您所见,结果中有一个“命名空间前缀”键(“ns0:key”、“ns1:key”)

问题是:如何使用 Javascript 对象处理这个问题?任何人都可以帮忙吗?

4

3 回答 3

4

访问名称中带有特殊字符的属性时,请像访问关联数组属性一样访问它:

yourObject.result["ns0:key"]

由于命名空间和值属性存储在作为数组第一个索引的对象内部,因此要访问命名空间和值,请使用以下语法:

yourObject.result["ns0:key"][0].namespace
yourObject.result["ns0:key"][0].value       // contains "prince-of-persia"

yourObject.result["ns1:key"][0].namespace
yourObject.result["ns1:key"][0].value       // contains "61-2561"
于 2012-05-20T19:45:35.463 回答
2

您的初始查询不是有效的 JSON(两个“关键”键将相互覆盖),所以我怀疑涉及到一个中间软件层(也许是 Freebase 的查询编辑器?)。

如果能够控制前缀(它们不是真正的名称空间)会有所帮助,您可以自己制作它们以适合您。使用“key”和“other:key”或任何适合你的方案。您还可以使用 |= 运算符重新编写查询,以便您可以在单个键子句中指定两个名称空间(例如,“key”:[{“namespace|=”:[ns1,ns2]}])。

于 2012-05-21T04:01:46.460 回答
0
for ( key in freebaseResult.result ) {
  var i, resultArray = freebaseResult.result[key];

  for ( i = 0; i < resultArray.length; i++ ) {
    alert( resultArray[i].namespace + ": " + resultArray[i].value );
  }
}
于 2012-05-20T19:49:21.627 回答