The JSON response returned from this wikipedia API call is a series of nested objects. To travel down the object property chain and access the text of interest, I have to first access a property whose value is a random number, dependent upon the wikipedia page I query by title.
An example for the page titled "San%20Francisco"
(page id = 49728):
Object Property Chain:
responseJSON.wiki[0].query.pages[<<page id>>].extract
Example API Call: https://en.wikipedia.org/w/api.php/?origin=*&format=json&action=query&prop=extracts&exintro=&explaintext=&titles=San%20Francisco
Is there some way that I can identify the property whose value is a random integer? There is only one child of pages in the chain whose value is an integer. I cannot think of another solution and do not know of any JSON parsing method that would be effective.
I am inexperienced with AJAX requests and am making my ajax call in this way using jQuery. I would like to mention this in case I am doing something naive:
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'
});
};
You can actually do this without
Object.keys
or other similar tricks if you add theindexpageids
parameter to the query.Example API call: https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&indexpageids=1&titles=San+Francisco&exintro=1&explaintext=1
Example JSON output:
Then you can use something like
data.query.pages[data.query.pageids[0]].extract
to get the extract (although bear in mind that sometimes no pages may be returned, depending on what query you use).Wikipedia's API sandbox is useful for discovering parameters like
indexpageids
- experimenting there is usually quicker than reading the docs.Well, if there is always a single property on pages object then you can try either method:
If your
object
has only a single key, you can get it usingObject.keys(object)[0]
and then perform a dynamic bracket-notation property access on the originalobject
. (This is what thedig
utility does in the example below.)Also note that you can use
.promise()
to make handling your JSON response a bit tidier. I would suggest you addtype: 'json'
to your AJAX request, too, so that you don't have to parse the string data yourself.