2009-07-25 19 views
2

私はJavascriptを初めて使い、オブジェクトに格納されているテキストを抽出しようとしています。オブジェクトリテラルを処理する方法は?

オブジェクトはオブジェクトリテラルとして定義され、関数を呼び出すJavascript script内の関数に渡されます。スクリプト(オブジェクト)は、この構造を持っている:

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

私の問題:オブジェクトは「foo」という名前のコールバック関数に渡され

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

私はプリントアウトする方法を知っています上記のコールバック関数を使用してクエリの変数をカウントしていますが、結果配列の最初の結果のタイトルをどのように出力するかわかりません。

最初の結果タイトルを表示するためにコールバック関数を変更するにはどうすればよいですか? また、すべての結果からすべてのタイトルを印刷できるforeachステートメントがありますか?

ありがとうございます!

UPDATE:このコードのJSBINがである:最初の結果のタイトルを取得するために

o.results.result[0].title 

http://jsbin.com/ejiwa/edit

+0

質問が間違っている - あなたはJSONをパースしていない、あなたは、JavaScriptの変数 – zakovyrya

+1

@クリス化合物と連携:あなたのコードにタイプミスがあります - あなたはあなたのコールの終了時に余分な閉じ括弧を持っています'foo()'に渡します。 – RichieHindle

+0

@リーチ:ありがとうございました。 – chris

答えて

4

は、次の作業をしていますか?すべての結果を繰り返し処理する:

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

編集:正しくコピーしてもよろしいですか?ここで私はRhinoで得るものです:

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

いいえ、残念ながらそれはありません – chris

+1

@chris:arsのコードは私のためには完璧に機能しますが、コードの入力ミスを修正する必要がありました。 'foo()'へのあなたの呼び出しのうちのどれか。 – RichieHindle

+0

奇妙な。私の側から貼り付けた出力を参照してください。 – ars

1

あなたはJSONから見ることができるように、オブジェクトは、オブジェクトの配列である「結果」というプロパティが含まれている「結果」というプロパティがあります。

最初のものを表示するには、すでにcountで行ったようにしてください。ただし、その代わりにタイトルの構造に従ってください。

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

} 

JSONが単純にJavaScriptのコードです:それぞれの結果をループする

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

、あなたはこのような例の配列のような結果プロパティの上に単にループ、することができます。 JSONスニペットをJavaScriptオブジェクト宣言と考えると、それを理解する上で問題はありません。

+0

次のステートメントを使用します。out.innerHTML = o.results.result [0] .title;動作していないようです。 – chris

+0

Ah数字.. o.query.results.result [0] .titleは正しいパスです:PあなたのペーストされたJSONスニペットに間違いがあるように見えます –

1

oパラメータがコールバック関数内にあるかどうかわかりません。 私は通常、XMLHttpRequestまたはActiveXObjectをグローバルvar reqに割り当てます。あなたが完全にサーバーがクライアントに送信され、サーバーとデータを信頼場合にのみ、eval()関数を使用する必要があることに留意すべきである

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

その後、コールバックを使用します。実際にeval()よりも高速でJSONパーサーがあり、JSONだけに制限されるのでより安全です。eval()はセキュリティリスクの可能性があるJavaScriptをすべて解析して実行できます。 ECMAScriptの次のバージョンでは、標準のJSONパーサーが組み込まれる予定です。

1

actual objectは、あなたが書いたものとは少し構造が異なります。 resultsは実際にはqueryの要素です。だから、これを試してみてください。

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

私はコードを分かりやすくしようとしている間に間違いを犯したと思いますが、 :o.query.resultsは定義されていません – chris

+0

私はYahooの元のデータでそれを実行すると私にとってはうまくいきます。 '関数foo(o){return o.query.results.result [0] .title; } 'は' ピザハット 'を返します。 – Gumbo

+0

心配しないで、あなたは正しいです。ありがとう!!! – chris