문제

이 코드를 사용하여 Wiki의 정보를 수집합니다.

http://en.wikipedia.org/w/api.php?action=query&rvprop=content&prop=revisions&format=json&titles=apple

그리고 나는 이와 같은 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 코드라는 것을 알고 있지만 해당 포럼에서는 동일한 질문/문제를 찾을 수 없었습니다. 이것이 누군가에게 유용 할 것이라고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top