ローカルJSONファイルを変数にロード


113

JavaScriptの変数に.jsonファイルをロードしようとしていますが、それを機能させることができません。おそらく小さなエラーですが、見つかりません。

次のような静的データを使用すると、すべてがうまく機能します。

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

私は中だすべてを置く{}にはcontent.json:ここで説明するように、そのローカルJavaScript変数にファイルや負荷にしようとしたが、負荷JSONを変数に

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 2013年

ファイルはWebContent \ jit \ content.jsonにあります。「url」を試してみましたが、「/ WebContent / jit / content.json」ですが、変数はnullです
PogoMips

回答:


38

オブジェクトをcontent.json直接貼り付けた場合、それは無効なJSONです。JSONのキー値は、値が数値、ブール値、または複合(配列またはオブジェクト)でない限り、二重引用符("ではなく')で囲む必要がありますnull。JSONに関数やundefined値を含めることはできません。以下は、有効なJSONとしてのオブジェクトです。

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

追加もありました}


1
私はそれが修正されたとは信じられません..なぜ二重引用符なしで.jsファイルに直接埋め込まれますが、.jsonファイルでは機能しないのですか?それは意味がありません...
PogoMips 2013年

16
@ user1695165-jsonとjavascriptオブジェクトは2つの異なるもので、見た目は同じです。
adeneo 2013年

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

1
ヒント:jsonlint.comなどのjsonバリデーターを使用して、jsonデータを使用する前に確認できます。
Marco Panichi 2017年

129

ここで答えたように、私の解決策は次のものを使用することです:

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

ファイルは1回だけロードされ、それ以降のリクエストはキャッシュを使用します。

編集キャッシュを回避するために、モジュールを使用して、コメントで指定されたこのブログ投稿のヘルパー関数を次に示しfsます。

var readJson = (path, cb) => {
  fs.readFile(require.resolve(path), (err, data) => {
    if (err)
      cb(err)
    else
      cb(null, JSON.parse(data))
  })
}

48
このソリューションがRequireJSという名前の追加のライブラリを必要とすることを指定したかっただけです
Luis Kabongo 2016年

4
キャッシュを回避する方法は?
nono 2017


2
TLDR; キャッシングはユニットテストで彼を襲ったため、キャッシングを回避するヘルパー関数を提供します(ping @nono)。
Ehvince 2018年

@Ehvinceああ、記事全体を読んでいないので気づきませんでした。ありがとうございます:-)
Sangimed

50

ES6 / ES2015の場合、次のように直接インポートできます。

// example.json
{
    "name": "testing"
}


// ES6/ES2015
// app.js
import * as data from './example.json';
const {name} = data;
console.log(name); // output 'testing'

Typescriptを使用する場合は、jsonモジュールを次のように宣言できます。

// tying.d.ts
declare module "*.json" {
    const value: any;
    export default value;
}

Typescript 2.9以降では、次を追加できます-resolveJsonModule compilerOptions intsconfig.json

{
  "compilerOptions": {
    "target": "es5",
     ...
    "resolveJsonModule": true,
     ...
  },
  ...
}

5
インポートがChrome v72で機能しない-それでもUncaught SyntaxError: Unexpected token *
1000Gbps

2
これを使用するdataと、モジュールのように見えますが、それがdata.defaultオブジェクトです
Dustin Michels

1
これをコンソールで実行しようとしましたが、成功しませんでした。これはbabel-node 6.26.0のノードv12.4.0では機能しません。私は常に得るSyntaxError: Unexpected token *
mario199

2
ES6 / ES2015の場合、直接インポートできます。MIMEimport * as data from './example.json'タイプのエラーが原因で、コンソールエラーが発生するようです。
Fallenreaper

私が使用する場合import * as data from './example.json';、それdataは単なるモジュールですdata.defaultが、オブジェクトです。私が使用している場合しかしimport data from './example.json';、その後data、よりapplicapableであるオブジェクト、である
ネル

4

2つの考えられる問題があります。

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

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

    console.log(['json', json]);
  2. パスが間違っている可能性があります。HTMLドキュメントにスクリプトを読み込むために使用したのと同じパスを使用します。したがって、スクリプトがの場合はjs/script.jsjs/content.json

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


多分彼のバージョンのjqueryはまだこれをサポートしていませんか?表現を改善しました。
アーロンディグラ2013年

4

組み込みのnode.jsモジュールfsは、必要に応じて非同期または同期で実行します。

あなたはそれを使ってそれをロードすることができます var fs = require('fs');

非同期

fs.readFile('./content.json', (err, data) => {
    if (err)
      console.log(err);
    else {
      var json = JSON.parse(data);
    //your code using json object
    }
})

同期

var json = JSON.parse(fs.readFileSync('./content.json').toString());

-1

ファイル〜/ my-app / src / db / abc.jsonのような特定のjson形式の場合:

  [
      {
        "name":"Ankit",
        "id":1
      },
      {
        "name":"Aditi",
        "id":2
      },
      {
        "name":"Avani",
        "id":3
      }
  ]

〜/ my-app / src / app.jsのような.jsファイルにインポートするには:

 const json = require("./db/abc.json");

 class Arena extends React.Component{
   render(){
     return(
       json.map((user)=>
        {
          return(
            <div>{user.name}</div>
          )
        }
       )
      }
    );
   }
 }

 export default Arena;

出力:

Ankit Aditi Avani

これは、ここで尋ねた質問ではない質問への回答です。
ケビンB

私の説明によると@ KevinB、.jsonファイルを.jsファイルにインポートしました。これは、json-fileをconst jsonにロードするのに役立ちました。ここから、ユーザー属性などに次のjson辞書を使用できます。
Ank_247shbm

それはすばらしいことですが、この質問は、ユーザーがオブジェクトリテラルを.jsonファイルにコピーして、それをajaxでロードしようとしているユーザーに関するものです。オブジェクトリテラルは、JSONでは無効な形式でした。requireを使用してreactをインポートし、これをインポートすることは確かに機能する場合もありますが、実際にはこのケースには役立ちません。
ケビンB

注:この回答にリンクするコメントを他のすべての回答に投稿することは、過度の自己宣伝と見なされる可能性があり、回答を編集しようとすることは破壊行為です。コメントが削除されました。今後このような編集を行わないでください。
ブラッド・ラーソン

ありがとうございます。
Qui-Gon Jinn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.