لا يمكن استخدام Wiki API بتنسيق JSON الحصول على المحتوى

StackOverflow https://stackoverflow.com/questions/1216712

سؤال

أستخدم هذا الرمز لجمع المعلومات من 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 أعادني كسلسلة 18978754، لكنه لا يمكنه الحصول على القيمة بهذا:

jsonObject.query.pages.18978754

بعض الافتراضات التي أريد توضيحها، لا أعرف الرقم 18978754.هل أحتاج إلى الحصول على الرقم أولاً أم لا يزال بإمكاني الحصول على "شيء ما..." من خلال معرفة الرقم.

هل كانت مفيدة؟

المحلول

ماذا عن استخدام بناء جملة المصفوفة:

jsonObject.query.pages[18978754]

يبدو أنه يعمل باستخدام firebug :

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

و :

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

لاحظ أن الوصول إلى كائن البيانات باستخدام بناء جملة مصفوفة ممكن أيضًا للخصائص الأخرى؛على سبيل المثال :

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

هذا بناء جملة JS صالح تمامًا :-)


تمت الإضافة بعد رؤية التعليق/التعديل

إذا كنت لا تعرف معرفات الصفحات، فيمكنك التكرار على الصفحات باستخدام شيء مثل هذا:

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

لاحظ أنني أستخدم hasOwnProperty للتأكد من أن الكائن الذي أمتلكه يمتلك هذه الملكية، وأنه لا يأتي من أي نوع من الميراث أو أي شيء من هذا القبيل:

كل كائن ينحدر من الكائن يرث طريقة HasownProperty.يمكن استخدام هذه الطريقة لتحديد ما إذا كان للكائن الخاصية المحددة كخاصية مباشرة لهذا الكائن ؛على عكس المشغل ، لا تتحقق هذه الطريقة من سلسلة النموذج الأولي للكائن.

على حسب ما هو موجود"revision"، قد يتعين عليك أن تفعل الشيء نفسه في هذا أيضًا، راجع للشغل ...


نأمل أن يساعد هذا بشكل أفضل :-)



التعديل الثاني، بعد المجموعة الثانية من التعليقات:

حسنًا، لنذهب أبعد قليلًا (لم أعتقد أنك تقصد ذلك حرفيًا):

data.query.pages[pageId].revisions

عبارة عن مصفوفة (لاحظ [] الرموز) التي يبدو أنها قادرة على احتواء عدة كائنات.
لذلك، يمكنك الحصول على أول واحد منهم بهذه الطريقة:

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

والثاني بهذه الطريقة:

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

(لا يوجد واحد ثانٍ في المثال الذي قدمته، راجع للشغل - لذلك هذا من الناحية النظرية ^^)

وما إلى ذلك وهلم جرا.


للحصول على جميع هذه الكائنات، عليك القيام بنوع من الحلقات، مثل هذا:

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، أحصل الآن على اللدغة الحرفية التي تبحث عنها:

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. مزيد من المعلومات هنا .

وكان هذا نفس المشكلة أثناء إنشاء محلل القائم فب لAPI ويكي - وهنا كيف حلها.

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

$final_result = $new_result["pageid"];

ملحوظة: أعرف أن هذا هو رمز PHP في سؤال JS، ولكن لا يمكن أن تجد بالضبط نفس السؤال / المشكلة في هذا المنتدى - أنا متأكد من أن هذا سيكون مفيدا لشخص ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top