형식별로 Wiki API 사용 JSON은 컨텐츠를 얻을 수 없습니다.
-
06-07-2019 - |
문제
이 코드를 사용하여 Wiki의 정보를 수집합니다.
그리고 나는 이와 같은 JSON 스트링을 얻을 수 있습니다
{
"query": {
"normalized": [{
"from": "apple",
"to": "Apple"
}],
"pages": {
"18978754": {
"pageid": 18978754,
"ns": 0,
"title": "Apple",
"revisions": [{
"*": "Something....."
}]
}
}
}
}
나는 그것을 JSON으로 평가할 수 있지만, 문제는 쿼리> 페이지에 들어갈 수 있다는 것입니다. 그 후 더 깊어 질 수 없어서 Wiki API가 나를 String 18978754로 반환했기 때문입니다. 이것에 의한 가치 :
jsonObject.query.pages.18978754
명확히해야 할 몇 가지 가정은 18978754 숫자를 모릅니다. 숫자를 먼저 얻어야합니까?
해결책
Array-Syntax 사용은 어떻습니까 :
jsonObject.query.pages[18978754]
Firebug를 사용하여 작동하는 것 같습니다.
>>> data.query.pages[18978754]
Object pageid=18978754 ns=0 title=Apple revisions=[1]
그리고 :
>>> data.query.pages[18978754].title
"Apple"
참고 다른 속성에 대해서는 배열 -syntax로 데이터를 액세스 할 수 있습니다. 예를 들어 :
>>> data['query'].pages[18978754].title
"Apple"
완벽하게 유효한 JS 구문입니다 :-)
주석 / 편집을 한 후 추가되었습니다
페이지의 ID를 모르는 경우 페이지를 반복 할 수 있습니다.
for (var pageId in data.query.pages) {
if (data.query.pages.hasOwnProperty(pageId)) {
console.log(data.query.pages[pageId].title);
}
}
내가 사용하고 있습니다 hasOwnProperty
내가 켜져있는 대상에 속성이 있고 어떤 종류의 상속이나 그와 비슷한 곳에서 나오지 않는지 확인하기 위해.
객체에서 내려온 모든 객체는 HasownProperty 메소드를 상속합니다. 이 방법은 객체가 지정된 속성을 해당 객체의 직접 특성으로 지정된지를 결정하는 데 사용될 수 있습니다. IN 연산자와 달리이 방법은 객체의 프로토 타입 체인을 확인하지 않습니다.
내용에 따라 "revision
", 당신도 그와 똑같이해야 할 수도 있습니다, btw ...
이것이 더 도움이되기를 바랍니다 :-)
두 번째 편집, 두 번째 댓글 세트 후 :
글쎄, 조금 더 멀리가는 (문자 그대로 의미가 없다고 생각하지 않았다) :
data.query.pages[pageId].revisions
배열입니다 (참고 []
기호) 여러 객체를 포함 할 수있는 것 같습니다.
따라서 이런 식으로 첫 번째를 얻을 수 있습니다.
data.query.pages[pageId].revisions[0]
두 번째는이 방법 :
data.query.pages[pageId].revisions[1]
(예를 들어 제공 한 예제에는 BTW가 없습니다. 그래서 이것은 이론적입니다 ^^)
등등.
그 물체의 모든 사람을 얻으려면 다음과 같은 종류의 루프를 수행해야합니다.
var num_revisions = data.query.pages[pageId].revisions.length;
var i;
for (i=0 ; i<num_revisions ; i++) {
console.log(data.query.pages[pageId].revisions[i]);
}
그리고 이제 그 루프 내부에서 주어진 객체의 '*'속성을 얻을 수 있어야합니다.
data.query.pages[pageId].revisions[i]['*']
따라서 최종 코드는 다음과 같습니다.
for (var pageId in data.query.pages) {
if (data.query.pages.hasOwnProperty(pageId)) {
var num_revisions = data.query.pages[pageId].revisions.length;
var i;
for (i=0 ; i<num_revisions ; i++) {
console.log(data.query.pages[pageId].revisions[i]['*']);
}
}
}
이 코드를 FireBug에서 사용하면 이제 원하는 Literral Sting을 얻습니다.
Something.....
물론, 당신은 아마도 사용할 수있을 것입니다.
for (var pageId in data.query.pages) {
if (data.query.pages.hasOwnProperty(pageId)) {
console.log(data.query.pages[pageId].revisions[0]['*']);
}
}
항상 첫 번째 요소 만 다루고 싶다면 잘 작동합니다. revisions
정렬.
단지 조심하십시오 : 당신의 예에서는 단 하나의 개정이있었습니다. 내가 제공 한 코드는 많은 사람들을 다룰 수 있어야합니다. 당신이 그들과 함께하고 싶은 일을 결정하기 위해 당신에게 ;-)
다른 팁
늦었지만 다른 사람에게 도움이 될 수도 있습니다.
추가 할 때 &indexpageids
귀하의 요청에 따라 얻을 수 있습니다 pageids
. 추가 정보 여기.
Wiki API를위한 PHP 기반 파서를 만드는 동안 같은 문제가있었습니다. 여기에 어떻게 해결했는지는 다음과 같습니다.
$new_result = array_pop($result["query"]["pages"]);
$final_result = $new_result["pageid"];
참고 : 이것이 JS 질문에서 PHP 코드라는 것을 알고 있지만 해당 포럼에서는 동일한 질문/문제를 찾을 수 없었습니다. 이것이 누군가에게 유용 할 것이라고 확신합니다.