Pregunta

Utilizo este código para recopilar la información de Wiki:

  

http: //en.wikipedia .org / w / api.php? action = query & amp; rvprop = content & amp; prop = revisiones & amp; format = json & amp; title = apple

Y puedo obtener una cadena JSON como esta

{
    "query": {
        "normalized": [{
            "from": "apple",
            "to": "Apple"
        }],
        "pages": {
            "18978754": {
                "pageid": 18978754,
                "ns": 0,
                "title": "Apple",
                "revisions": [{
                    "*": "Something....."
                }]
            }
        }
    }
}

Puedo evaluarlo en JSON, pero el problema es que puedo ingresar a las páginas de consulta > después de eso no puedo profundizar más, fue porque la API Wiki me devolvió como una Cadena 18978754, pero puede ' t obtenga el valor por esto:

jsonObject.query.pages.18978754

Alguna suposición que necesito aclarar, no sé el número 18978754. ¿Debo obtener el número primero o aún puedo obtener "Algo ..."? dentro de saber el número.

¿Fue útil?

Solución

¿Qué pasa con el uso de la sintaxis de matriz:

jsonObject.query.pages[18978754]

Parece estar funcionando, usando firebug:

>>> data.query.pages[18978754]
Object pageid=18978754 ns=0 title=Apple revisions=[1]

Y:

>>> data.query.pages[18978754].title
"Apple"

Tenga en cuenta que el acceso al objeto de datos con una sintaxis de matriz también es posible para las otras propiedades; por ejemplo:

>>> data['query'].pages[18978754].title
"Apple"

Esa es una sintaxis JS perfectamente válida :-)


Agregado después de ver el comentario / editar

Si no conoce los identificadores de las páginas, puede iterar sobre las páginas, con algo como esto:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].title);
    }
}

Tenga en cuenta que estoy usando hasOwnProperty para asegurarse de que el objeto en el que estoy tiene la propiedad, y que no proviene de ningún tipo de herencia ni nada por el estilo:

  

Todos los objetos descienden de Object   hereda el método hasOwnProperty.   Este método puede usarse para determinar   si un objeto tiene el especificado   propiedad como propiedad directa de ese   objeto; a diferencia del operador in, esto   El método no marca el   cadena prototipo del objeto.

Dependiendo de lo que se encuentre en " revision " ;, es posible que también tenga que hacer lo mismo en ese caso, por cierto ...


Espero que esto ayude mejor :-)



Segunda edición, después del segundo conjunto de comentarios:

Bueno, yendo un poco más lejos (no pensé que lo dijeras literalmente):

data.query.pages[pageId].revisions

es una matriz (tenga en cuenta los símbolos [] ) que parece ser capaz de contener varios objetos.
entonces, puedes obtener el primero de estos de esta manera:

data.query.pages[pageId].revisions[0]

El segundo de esta manera:

data.query.pages[pageId].revisions[1]

(no hay un segundo en el ejemplo que proporcionó, por cierto, esto es en teoría ^^)

Y así sucesivamente.


Para obtener todos esos objetos, tendría que hacer algún tipo de bucle, como este:

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]);
}

Y ahora, dentro de ese ciclo, debería poder obtener la propiedad '*' del objeto dado:

data.query.pages[pageId].revisions[i]['*']


Entonces, el código final se convierte en:

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]['*']);
        }
    }
}

Usando este código en firebug, ahora obtengo la picadura literal que estás buscando:

Something.....


Por supuesto, probablemente podría usar:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].revisions[0]['*']);
    }
}

Que funcionará bien si siempre desea tratar solo con el primer elemento de la matriz revisiones .


Solo tenga cuidado: en su ejemplo, solo hubo una revisión; el código que proporcioné debería poder tratar con muchos; depende de usted determinar qué quiere hacer con ellos ;-)

Otros consejos

Tarde pero quizás útil para alguien más.

Cuando agrega & amp; indexpageids a su solicitud, obtendrá los pageids . Más información aquí .

Tuve este mismo problema al crear un analizador basado en php para la API Wiki: así es como lo resolví.

$new_result = array_pop($result["query"]["pages"]);

$final_result = $new_result["pageid"];

Nota: Sé que este es el código PHP en una pregunta de JS, pero no pude encontrar exactamente la misma pregunta / problema en ese foro. Estoy seguro de que esto será útil para alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top