Freebase:使用“namespace-prefix key”Json Object

时间:2012-05-20 19:41:09

标签: json freebase

我已向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对象处理此问题?有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

访问名称中包含特殊字符的属性时,可以像关联数组属性一样访问它:

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"

答案 1 :(得分:2)

您的初始查询无效JSON(两个“密钥”键会互相覆盖),所以我怀疑是否涉及中间软件层(可能是Freebase的查询编辑器?)。

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

答案 2 :(得分: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 );
  }
}