2013-01-23 12 views
53

javascriptの変数に.jsonファイルをロードしようとしていますが、動作させることができません。それはおそらくほんの小さなエラーですが、私はそれを見つけることができません。私はこのようなスタティックデータを使用する場合ローカルのJSONファイルを変数にロード

すべてが正常に動作します:

var json = { 
      id: "whatever", 
      name: "start", 
      children: [{ 
         "id":"0.9685","name":" contents:queue"},{ 
         "id":"0.79281","name":" contents:mqq_error"}}] 
     } 

ここで説明するようなので、私はcontent.jsonファイルに{}でだすべてのものを入れて、ローカルのjavascript変数にそれをロードしようとしました:load json into variable

var json = (function() { 
     var json = null; 
     $.ajax({ 
      'async': false, 
      'global': false, 
      'url': "/content.json", 
      'dataType': "json", 
      'success': function (data) { 
       json = data; 
      } 
     }); 
     return json; 
    })(); 

私はクロームデバッガでそれを実行し、それが常に変数JSONの値がnullであることを私に伝えます。 content.jsonは、それを呼び出す.jsファイルと同じディレクトリにあります。

私は何を欠席しましたか?

+1

ファイルのURLは '/ content.json'です。これは、ファイルがWebアプリケーションのルートレベルにあることを意味します。 'content.json'(スラッシュなし)に変更して、スクリプトファイルが置かれているのと同じディレクトリに置いてください。あなたのスクリプトファイルがルートレベルのディレクトリにある場合にのみ、それは動作します。 – Samich

+0

ファイルはWebContent \ jit \ content.jsonにあります。私は 'url': "/WebContent/jit/content.json"を試しましたが、まだ変数がnullです – PogoMips

答えて

23

オブジェクトを直接content.jsonに貼り付けた場合、jsonは無効です。 jsonキーのAND値は、値が数値でない限り、二重引用符で囲まなければなりません(単一ではありません)。以下は、あなたのオブジェクトが有効なjsonとなります。

{ 
    "id": "whatever", 
    "name": "start", 
    "children": [{ 
    "id":"0.9685","name":" contents:queue"},{ 
    "id":"0.79281","name":" contents:mqq_error"}] 
} 

(あなたも、余分な}を持っていた)

+0

私はそれを修正できないと信じられません。なぜそれが.jsファイルに直接埋め込まれ、二重引用符ではなく、.jsonファイルに埋め込まれないのでしょうか?それは意味をなさない... – PogoMips

+9

@ user1695165 - jsonとjavascriptオブジェクトは2つの異なるものですが、それらは同じように見えます。 – adeneo

+1

@Kevin B "...値が数値[またはブール値]でない限り。 –

4

考えられる原因は2つあります

  1. AJAXは非同期ですので、あなたは、外側の関数から戻ったときjsonは不定となります。ファイルがロードされると、コールバック関数はjsonに何らかの値を設定しますが、その時点では誰も気にしません。

    'async': falseでこれを修正しようとしています。これが機能するかどうかを確認するには、コードに次の行を追加して、ブラウザのコンソールをチェックしてください。

    console.log(['json', json]); 
    
  2. パスが間違っているかもしれません。 HTMLドキュメントでスクリプトを読み込むのと同じパスを使用します。したがって、スクリプトがjs/script.jsの場合は、js/content.json

    を使用してください。ブラウザによっては、アクセスしようとしたURLとその方法(成功/エラーコード、HTMLヘッダーなど)を表示するブラウザがあります。ブラウザの開発ツールで何が起こっているかを確認してください。

+0

彼のバージョンのjqueryはこれをまだサポートしていません?私は言葉を改善しました。 –

69

私のソリューションは、hereに答えとして、使用することです:

var json = require('./data.json'); //with path 

ファイルは一度だけロードされ、さらに要求がキャッシュを使用しています。

+24

このソリューションに[RequireJS](http://requirejs.org)という追加のライブラリが必要であることを指定したかっただけです。 –

+16

nodejsのボックスの外で動作することに注意してください。 – Ehvince

+3

キャッシングを避けるには? – nono

関連する問題