此维基百科API调用返回的JSON响应是一系列嵌套对象。要沿着对象属性链向下移动并访问感兴趣的文本,我必须首先访问一个值为随机数的属性,这取决于我按标题查询的维基百科页面。
标题为"San%20Francisco"
(页面ID = 49728)的页面的示例:
对象属性链:
responseJSON.wiki[0].query.pages[<<page id>>].extract
是否有某种方法可以识别其值为随机整数的属性?链中只有一个子页面,其值为整数。我想不出另一个解决方案,也不知道任何有效的JSON解析方法。
我对AJAX请求缺乏经验,并且正在使用jQuery以这种方式进行我的ajax调用。我想提一下,以防我做一些天真的事情:
var getWiki = function (obj) {
return $.ajax({
url: "http://en.wikipedia.org/w/api.php" +
"?origin=*" + "&format=json" +
"&action=query" + "&prop=extracts" +
"&exintro=" + "&explaintext=" + "&titles=" +
obj.position,
method: 'GET'
});
};
答案 0 :(得分:1)
如果您的object
只有一个密钥,则可以使用Object.keys(object)[0]
获取该密钥,然后对原始object
执行动态括号 - 表示法属性访问。 (这是dig
实用程序在下面的示例中执行的操作。)
另请注意,您可以使用.promise()
使JSON响应处理更加整洁。我建议您也将type: 'json'
添加到您的AJAX请求中,这样您就不必自己解析字符串数据了。
function getWiki(obj) {
return $.ajax({
url: "http://en.wikipedia.org/w/api.php" +
"?origin=*" + "&format=json" +
"&action=query" + "&prop=extracts" +
"&exintro=" + "&explaintext=" + "&titles=" +
obj.position,
method: 'GET',
type: 'json'
}).promise()
}
function dig(object) {
return object[Object.keys(object)[0]]
}
getWiki({
position: 'San Francisco'
})
.then(function(json) {
console.log(
dig(json.query.pages).extract //=> 'San Francisco (SF) ...'
)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:1)
好吧,如果页面对象上总是有一个属性,那么你可以尝试使用任何一种方法:
if (typeof Object.values !== 'function') {
Object.values = obj => Object.keys(obj).map(key => obj[key]);
}
const responseJSON = {
"batchcomplete": "",
"query": {
"pages": {
"49728": {
"pageid": 49728,
"ns": 0,
"title": "San Francisco",
"extract": "Some text"
}
}
}
}
const pages = responseJSON.query.pages;
const extractedWithKeys = pages[Object.keys(pages)[0]];
const extractedObjValues = Object.values(pages)[0];
console.log(extractedWithKeys, extractedObjValues)
答案 2 :(得分:0)
如果将Object.keys
参数添加到查询中,您实际上可以在没有indexpageids
或其他类似技巧的情况下执行此操作。
示例JSON输出:
{
"batchcomplete": "",
"query": {
"pageids": [
"49728"
],
"pages": {
"49728": {
"pageid": 49728,
"ns": 0,
"title": "San Francisco",
"extract": "San Francisco (initials SF) <snip>"
}
}
}
}
然后您可以使用类似data.query.pages[data.query.pageids[0]].extract
的内容来获取摘录(但请记住,有时不会返回任何页面,具体取决于您使用的查询)。
维基百科API sandbox对于发现像indexpageids
这样的参数非常有用 - 试验通常比阅读文档更快。