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