2009-07-25 16 views
2

Ich bin neu in Javascript und versuche, etwas Text in einem Objekt gespeichert zu extrahieren.Wie verarbeitet man ein Objektliteral?

Das Objekt wird als Objektliteral definiert und an eine Funktion in einer Javascript script übergeben, die die Funktion aufruft. Das Skript (und Objekt) haben diese Struktur:

foo({ 
    "query": { 
    "count": "2", 
    "created": "2009-07-25T08:17:54Z", 
    "lang": "en-US", 
    }, 
    "results": { 
    "result": [ 
    { 
    "abstract": "<b>Pizza</b> Hut®. Order Online for Delivery or Carry-out. Fast &amp; Easy.", 
    "title": "<b>Pizza</b> Hut" 
    }, 
    { 
    "abstract": "Official site of Domino's <b>Pizza</b> delivery chain, which offers thin crust, deep dish, and hand tossed <b>pizzas</b> with a variety of side items and beverages. Site <b>...</b>", 
    "title": "Domino's <b>Pizza</b>" 
    } 
    ] 
    } 
} 
}); 

Das Objekt wird in einer Callback-Funktion mit dem Namen „foo“ übergeben:

function foo(o){ 
    var out = document.getElementById('container'); 
    out.innerHTML = o.query.count; 
} 

Mein Problem: Ich weiß, wie man aus dem zum Drucken Abfrage-Count-Variable mit der obigen Callback-Funktion, aber ich weiß nicht, wie Sie den Titel des ersten Ergebnisses im Ergebnis-Array ausdrucken.

Wie kann ich die Rückruffunktion ändern, um den ersten Ergebnistitel anzuzeigen? Und gibt es auch eine foreach-Anweisung, wo ich alle Titel aus allen Ergebnissen ausdrucken könnte?

Danke!

UPDATE: JSBIN für diesen Code ist: http://jsbin.com/ejiwa/edit

+0

Frage falsch ist - Sie analysieren nicht JSON, Sie arbeiten mit Verbindung JavaScript-Variable – zakovyrya

+1

@ Chris: Es ist ein Tippfehler in Ihrem Code - Sie haben eine zusätzliche schließende Klammer am Ende des Gesprächs zu 'foo()'. – RichieHindle

+0

@Richie: Danke, dass ich das nicht bemerkt habe – chris

Antwort

4

Hat die folgenden Arbeiten:

o.results.result[0].title 

die ersten Ergebnis Titel zu bekommen? Und über alle Ergebnisse iterieren:

for (var i=0; i<o.results.result.length; i++) { 
    var result = o.results.result[i]; 
    alert(result.title); 
} 

EDIT: Sind Sie sicher, dass Sie es richtig kopiert? Hier ist, was ich in Rhino erhalten:

js> o = { 
    "query": { 
    "count": "2", 
    "created": "2009-07-25T08:17:54Z", 
    "lang": "en-US", 
    }, 
    "results": { 
    "result": [ 
    { 
    "abstract": "<b>Pizza</b> Hutr. Order Online for Delivery or Carry-out. Fast &amp; Easy.", 
    "title": "<b>Pizza</b> Hut" 
    }, 
    { 
    "abstract": "Official site of Domino's <b>Pizza</b> delivery chain, which offers thin crust, deep dish, and hand tossed <b>pizzas</b> with a variety of side items and beverages. Site <b>...</b>", 
    "title": "Domino's <b>Pizza</b>" 
    } 
    ] 
    } 
} 

js> o.results.result[0].title 
<b>Pizza</b> Hut 
+0

nein, leider nicht – chris

+1

@chris: ars Code funktioniert perfekt für mich, obwohl ich einen Tippfehler in Ihrem Code korrigieren musste - Sie haben eine zusätzliche schließende Klammer am Ende deines Rufes zu 'foo()'. – RichieHindle

+0

Seltsam. Sieh dir die Ausgabe an, die ich gerade von meiner Seite eingefügt habe. – ars

1

Wie Sie aus dem JSON sehen können, hat das Objekt eine Eigenschaft „Ergebnisse“ genannt, die eine Eigenschaft enthält als „Ergebnis“, die ein Array von Objekten ist.

Um die erste davon anzuzeigen, tun Sie einfach wie Sie bereits mit count, aber folgen Sie einfach der Struktur zum Titel statt.

o.query.results.result[0].title 

Schleife über jedes Ergebnis, können Sie einfach eine Schleife über das Ergebnis Eigenschaft wie ein Array, zum Beispiel wie folgt aus:

var results = o.query.results.result; 
for(var i = 0; i < results.length; i++) { 

} 

JSON ist einfach JavaScript-Code. Stellen Sie sich das JSON-Snippet als JavaScript-Objektdeklaration vor und Sie sollten keine Probleme haben, es zu verstehen.

+0

Verwenden Sie diese Anweisung: out.innerHTML = o.results.result [0] .title; scheint nicht zu funktionieren. – chris

+0

Ah Zahlen .. o.query.results.result [0] .title ist der richtige Pfad: P Sieht so aus, als ob ein Fehler in Ihrem eingefügt JSON-Snippet –

1

Ich bin nicht sicher, was der o-Parameter in Ihrer Callback-Funktion ist. Ich ordne das XMLHttpRequest oder ActiveXObject normalerweise einem globalen var req zu.

Dann einen Rückruf verwenden:

function json_callback() { 
    if (req.readyState == 4) { 
      if (req.status == 200) { 
        jsonObj = eval("(" + req.responseText + ")"); 
        var out = document.getElementById('container'); 
        out.innerHTML = jsonObj.query.count; 
      } 
     } 
} 

Es soll beachtet werden, dass Sie nur eval verwenden sollten(), wenn Sie voll und ganz auf dem Server vertrauen, und die Daten der Server den Client senden. Es gibt JSON-Parser, die tatsächlich schneller sind als eval() und auch sicherer, da sie nur auf JSON beschränkt sind, während eval() JavaScript vollständig parsen und ausführen kann, was ein Sicherheitsrisiko darstellen könnte. Es wird in der nächsten Version von ECMAScript erwartet, dass ein Standard-JSON-Parser eingebaut wird.

1

Die actual object hat eine etwas andere Struktur als Sie geschrieben haben. results ist eigentlich ein Element von query. Also das versuchen:

o.query.results.result[0].title 
+0

Ich glaube, ich habe einen Fehler gemacht, während ich versucht, den Code zu verschönern, aber Firebug sagt : o.query.results ist undefined – chris

+0

Es funktioniert für mich, wenn ich das auf den ursprünglichen Daten von Yahoo ausführen. 'Funktion foo (o) {return o.query.results.result [0] .title; } 'returns' Pizza Hütte '. – Gumbo

+0

Egal, du hast recht. Vielen Dank!!! – chris

Verwandte Themen