2011-11-08 20 views
3

サーブレットから渡され、xmlhttp.responseTextに格納されているJSONがあります。私はデータ、サイズ、スタイル、名前などの値を持つことができるように、このJSONを分解したいと思います。また、ウィジェットの値を別の変数にすることを望みます。私はこれを試してみましたJavascriptでのJSON文字列解析

{ 
    "widget vlaue=2": { 
    "debug": "on", 
    "window": { 
     "title": "Sample Konfabulator Widget", 
     "name": "main_window", 
     "width": 500, 
     "height": 500 
    }, 
    }, 
    "image": { 
    "src": "Images/Sun.png", 
    "name": "sun1", 
    "hOffset": 250, 
    "vOffset": 250, 
    "alignment": "center" 
    }, 
    "text": { 
    "data": "Click Here", 
    "size": 36, 
    "style": "bold", 
    "name": "text1", 
    "hOffset": 250, 
    "vOffset": 100, 
    "alignment": "center", 
    "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 
}  

:ここ

はJSONです

obj = JSON.parse(xmlhttp.responseText); 

が、これは失敗しました。私はそれに関連するものをオンラインで見つけることができませんでした。誰もがこれで私を助けてくれる? json.orgから

+3

あなたが "失敗した" それはどういう意味ですか?ブラウザから何かエラーがありましたか? –

+0

この出力は「未定義」です – typedefcoder2

+0

「出力はこのために '未定義です」とはどういう意味ですか? 「これ」とは何で、「成果」は何ですか? –

答えて

7

がオブジェクトにJSONテキストを変換するには、evalの() 機能を使用することができます。 eval()はJavaScriptコンパイラを呼び出します。 JSONは JavaScriptの適切なサブセットであるため、コンパイラは正しく テキストを解析し、オブジェクト構造を生成します。テキストは の括弧で囲む必要があります。これにより、JavaScriptの構文のあいまいさが解消されます。

var myObject = eval( '(' + 'myJSONtext +') ');

しかしJSON.parseはまだお勧めします。

eval関数は非常に高速です。しかし、それはコンパイルして JavaScriptプログラムを実行することができるので、セキュリティ上の問題がある可能性があります。ソースが信頼され、有能である場合、 evalの使用が示されます。 JSONパーサーを使用することは、多くの場合、 より安全です。 XMLHttpRequest上のWebアプリケーションでは、 ページを提供する同じ起点にのみ通信が許可されるため、信頼されます。しかしそれは有能な人ではないかもしれません。サーバ がJSONエンコーディングで厳密ではない場合、または慎重に がすべての入力を検証しない場合、危険なスクリプトを運ぶ可能性のある無効なJSONテキスト を配信する可能性があります。 eval関数は というスクリプトを実行し、その悪意を解き放つでしょう。

これを防ぐには、JSONパーサーを使用する必要があります。 JSONパーサー はJSONテキストのみを認識し、すべてのスクリプトを拒否します。 がネイティブJSONサポートを提供するブラウザでは、JSONパーサーも evalよりもはるかに高速です。ネイティブなJSONサポートは、次のECMAScript標準の に含まれる予定です。

var myObject = JSON.parse(myJSONtext、reviver);

おそらくあなたのJSONに問題があります。jsonlint.comにアクセスして、無料のWebベースのJSON検証ツールを入手してください。

+0

JSONがJSONLintから検証されました。私はJavascriptにカムする前にそれをやっている。 – typedefcoder2

+0

あなたはそれがサーブレットからだと言っていますが、文字列が自動エスケープまたは変更されていないことを100%確信していますか?私はかつてPHPを使用してJSON文字列を渡していました。あなたが知っているように、二重引用符はPHPで正しくエスケープされていないため、すべての言語に異なるエスケープ文字があるため、サーブレットの予想される出力が変更されている可能性があります。サーバー側のJSON文字列を印刷して、上に投稿したとおりに正確かどうかを確認してください。 – Gapton

+0

上記の例は同様の例です。私は秘密のために正確なJSONを投稿できません。私のJSONはJSONLintから検証されています。 – typedefcoder2

5

ご提供いただいたJSONはINVALIDです。 9行目には,が含まれています。

ここには、,なしで動作するJSFiddleがあります。

http://jsfiddle.net/ApDsP/

+0

良いアイ、確かに私はそれがエラーであると信じています。今では、すべてのバリデーターがコンマの後ろをチェックしているわけではないので、JSONバリデーターに100%頼ってはならないことを知りました。 (これは、すべてのJSONライブラリで禁止されているわけではないからです) – Gapton

+0

オペレーションがJSlintに貼り付けられていたJSONがわかりませんが、問題のJSONはJSlintでも検証されません。 – Strelok

+0

実際、JSONをコピーしてJSONLintに貼り付けたのは初めてでした。今私はちょうど5秒前にもう一度試しました、そしてそれは**失敗しました**(もちろん、9行目のコンマのために)。私はOPや他の人がJSONLintでそれを検証する最初の試みの後に投稿したJSONを編集したと思います。 – Gapton