JavaScriptで外部ローカルJSONファイルを読み取る方法は?


255

JSONファイルをローカルシステムに保存し、JSONファイルを読み取ってデータを印刷するためにJavaScriptファイルを作成しました。JSONファイルは次のとおりです。

{"resource":"A","literals":["B","C","D"]}

これがJSONファイルのパスであるとしましょう:/Users/Documents/workspace/test.json

JSONファイルを読み取ってJavaScriptでデータを印刷する簡単なコードを書くのを手伝ってくれませんか?


回答:


93

リクエストはHTTPを使用して行われるため、ローカルリソースに対してAJAX呼び出しを行うことはできません

回避策は、ローカルWebサーバーを実行し、ファイルを提供して、localhostにAJAX呼び出しを行うことです。

JSONを読み取るコードの作成を支援するという点では、次のドキュメントを読む必要がありますjQuery.getJSON()

http://api.jquery.com/jQuery.getJSON/


2
この場合、ローカルサーバーを実行する方法を教えていただけませんか。ローカルサーバーを実行するために何をする必要がありますか?
user2864315 2013年

2
どの環境を使用していますか?ウィンドウズ?Linux?
Chris Pickford

25
これはAJAXにのみ当てはまります。ChromeでHTML5のFile APIを使用して、すでに実行しました。質問はAJAXについては尋ねませんでした。
lauhub 2013年

10
Pythonがインストールされている場合は、コマンドラインpython -m SimpleHTTPServer 8888を使用http://localhost:8888/してブラウザー(WindowsまたはMac)で開くことができます。 8888ポートであり、変更できます。
地質学2014

3
@geotheoryのコメントを更新するには、Python 3のコマンドはpython -m http.server 8888
Marc Stober

192

JavaScriptを使用して外部ローカルJSONファイル(data.json)を読み取るには、最初にdata.jsonファイルを作成します。

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. スクリプトソースのjsonファイルのパスを、javascriptファイルと一緒に記述します。

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. jsonファイルからオブジェクトを取得する

    var mydata = JSON.parse(data);
    alert(mydata[0].name);
    alert(mydata[0].age);
    alert(mydata[1].name);
    alert(mydata[1].age);

詳細については、このリファレンスを参照してください


8
これは、ファイルを変更できる場合、またはファイルのコンテンツとして適切なJSONがない場合に機能します。たとえば、data.json上記のサンプルコンテンツは実際にはJavaScriptであるため、jsonlint.comの検証に合格しません。ラッピング単一引用符を削除すると、純粋なJavaScriptになります。
Jason Aller 2014年

3
注: JSON.parse一部の古いブラウザではサポートされていません(IEを見ている)。MDNのブラウザの互換性の表をwindow.JSON参照してください。
Sumner Evans、

JSON.parse(data);すべきではありません。データが文字列であるため機能しませんか?
call-me

260
これは正解ではありません。答えの例はjsonファイルをロードしていません。実際には、ハードコードされたjsonをと名付けられた変数として格納する別のJavaScriptファイルをロードしていますdata。jsonの周りから文字列の引用符を削除した場合は、data.json を使用する必要さえありませんJSON.parse。問題は、JSONファイルをロードする方法ではなく、JSONを別のJavaScriptファイルにハードコードしてからロードする方法です。
ウリウォン2015年

1
JSON.parse(window.data);変数のより良い情報を提供scopedataます。
Akash

126

.jsonハードディスクからファイルのロードは非同期操作であるため、ファイルのロード後に実行するコールバック関数を指定する必要があります。

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}

//usage:
readTextFile("/Users/Documents/workspace/test.json", function(text){
    var data = JSON.parse(text);
    console.log(data);
});

この機能は、負荷Aにも働く.html.txtにMIMEタイプのパラメータをオーバーライドすることによって、ファイル"text/html""text/plain"など


14
これは非常に悪い習慣です!Google Chromeでは、ローカルリソースに対してXmlHttpRequestを作成できません。
mhaseeb 2017年

11
@mhaseebリソースが要求元システムと同じドメイン/プロトコルを持っている場合(これがローカルであるため)、(今でも将来でも)できます。CORSを検索します。
GreySage 2017年

11
現在のChromeでこれを試してみると、「クロスオリジンリクエストはプロトコルスキームでのみサポートされています:http、data、chrome、chrome-extension、https」。-つまり、ここでは暗黙のファイルプロトコルはありません@GreySage
eis

2
XMLHttpRequest.statusは数値を返します。これは、JavaScriptがバックグラウンドでコードを停止させないようにするためにのみ機能します。rawFile.status === 200
user3044394

1
またrawFile.responseType = 'json';、jsonオブジェクトを自動的に解析するように設定することもできます。コールバックではrawFile.responseなく渡すようにrawFile.responseTextしてください。
Ignat

34

Node.jsの場合、またはブラウザrequire.jsを使用する場合、次のようにするだけです。

let json = require('/Users/Documents/workspace/test.json');

注:ファイルは1回だけロードされ、以降の呼び出しではキャッシュが使用されます。


2
違います!Javascriptには組み込みは必要ありません

1
@PauliSudarshanTerho Thx、あなたは正しいです!Node / require.jsの要件を回答に追加しました。
musicformellons

29
  1. まず、jsonファイルを作成します。この例では、私のファイルはwords.jsonです

[{"name":"ay","id":"533"},
{"name":"kiy","id":"33"},
{"name":"iy","id":"33"},
{"name":"iy","id":"3"},
{"name":"kiy","id":"35"},
{"name":"kiy","id":"34"}]

  1. そして、これが私のコード、つまりnode.jsです。'utf8'への引数に注意してくださいreadFileSync:これにより、BufferJSON.parseそれを処理することはできますが)ではなく文字列が返されます。結果を確認するサーバーを作成しています...

var fs=require('fs');
var data=fs.readFileSync('words.json', 'utf8');
var words=JSON.parse(data);
var bodyparser=require('body-parser');
console.log(words);
var express=require('express');

var app=express();

var server=app.listen(3030,listening);

function listening(){
console.log("listening..");
}
app.use(express.static('website'));
app.use(bodyparser.urlencoded({extended:false}));
app.use(bodyparser.json());

  1. 特定のIDの詳細を読みたい場合は、コードを次のように説明できます。

 app.get('/get/:id',function(req,res){
	
var i;
		 
 for(i=0;i<words.length;++i)
 {
 if(words[i].id==req.params.id){
 res.send(words[i]);
 }
}
console.log("success");
	  
});

  1. URLを入力localhost:3030/get/33すると、そのIDに関連する詳細が表示されます。また、名前で読み取ります。私のjsonファイルには、このコードを使用した類似の名前があります.1つの名前の詳細を取得できます...そして、すべての類似の名前を出力しませんでした

 app.get('/get/:name',function(req,res){
	
var i;
		 
 for(i=0;i<words.length;++i)
 {
 if(words[i].id==req.params.name){
 res.send(words[i]);
 }
}
console.log("success");
	  
});

  1. また、類似の名前の詳細を読みたい場合は、このコードを使用できます。

app.get('/get/name/:name',function(req,res){
word = words.filter(function(val){
  return val.name === req.params.name;
});
res.send(word);
			 
 console.log("success");
	  
});

  1. ファイル内のすべての情報を読みたい場合は、以下のコードを使用してください。

app.get('/all',sendAll);
 
 function sendAll(request,response){
 response.send(words);

 }
 


require()はどこから来ますか?私のブラウザはそれを見つけることができません
ShieldGenerator7 '22

require()は組み込み関数です。require()を使用すると、個別のファイルに存在するモジュールを含めることができます。requireの基本的な機能は、javascriptファイルを読み取り、ファイルを実行してから、エクスポートオブジェクトを返すことです
Syed Ayesha Bebe

5
require()はNode.jsに組み込まれており、ネイティブjsの一部ではありません
認知症

この回答では、Vanilla Javascriptを使用してファイルをロードする方法は示していませんが、Node .jsを使用してロードする方法を示しています
Amos Long

18

Fetch APIを使用するのが最も簡単なソリューションです。

fetch("test.json")
  .then(response => response.json())
  .then(json => console.log(json));

Firefoxでは完璧に機能しますが、Chromeではセキュリティ設定をカスタマイズする必要があります。


これを試してみると、次のエラーが発生しました:(node:2065)UnhandledPromiseRejectionWarning:エラー:絶対URLのみがサポートされています
Jangid

13


以前に多くの人が述べたように、これはAJAX呼び出しを使用して機能しません。ただし、回避策はあります。input要素を使用して、ファイルを選択できます。

選択したファイル(.json)は、次の構造である必要があります。

[
    {"key": "value"},
    {"key2": "value2"},
    ...
    {"keyn": "valuen"},
]


<input type="file" id="get_the_file">

次に、JSとFileReader()を使用してファイルを読み取ることができます。

document.getElementById("get_the_file").addEventListener("change", function() {
  var file_to_read = document.getElementById("get_the_file").files[0];
  var fileread = new FileReader();
  fileread.onload = function(e) {
    var content = e.target.result;
    // console.log(content);
    var intern = JSON.parse(content); // Array of Objects.
    console.log(intern); // You can index every object
  };
  fileread.readAsText(file_to_read);
});

ファイルの名前はどこに入れますか?
shieldgenerator7

1
この場合、CORSポリシーのため、ユーザーは自分でファイルを選択する必要があります。これにより、基本的に、Webページの開発者が想定外のデータを取得できなくなります(たとえば、プライベートファイルを取得することができます。不正な可能性のあるスクリプトにGETリクエストを送信し、ユーザーの許可なしに実行します)。CORSポリシーにより、この種のことをバックエンドなしで処理するのは面倒になりますが、ユーザーはより安全になります。実際にファイルを開きたい場合は、それらの要求を管理できるWebサーバーを実行する必要があります。
サラ・クロス

12

ブラウザによっては、ローカルファイルにアクセスできる場合があります。ただし、これはアプリのすべてのユーザーに対して機能するとは限りません。

これを行うには、http//www.html5rocks.com/en/tutorials/file/dndfiles/の手順を試すことができます。

ファイルが読み込まれたら、次の方法でデータを取得できます。

var jsonData = JSON.parse(theTextContentOfMyFile);

9

ローカルファイルを使用している場合は、なぜデータをjsオブジェクトとしてパックしないのですか?

data.js

MyData = { resource:"A",literals:["B","C","D"]}

XMLHttpRequestsなし、解析なし、MyData.resource直接使用するだけ


1
わかりましたが、JavaScriptのMyData.resourceパーツを完成させて、その使用法をより明確に示してください。ありがとう。
ベイ

9

とてもシンプル。
jsonファイルの名前を「.json」ではなく「.js」に変更します。

<script type="text/javascript" src="my_json.js"></script>

したがって、通常どおりにコードに従ってください。

<script type="text/javascript">
var obj = JSON.parse(contacts);

ただし、参考までに、コンテンツのjsonは以下の切り取りのように見えます。

contacts='[{"name":"bla bla", "email":bla bla, "address":"bla bla"}]';

4
それはjsonファイルではありません-それはJSファイルです。
Karpik、

9

ES6モジュールのようにインポートできます。

import data from "/Users/Documents/workspace/test.json"

次に、動的なjsonファイルをどのようにインポートできますか?私はあなたがあなたの方法で開発モードにいるときだけjsonファイルをインポートすることができると思います。
ダイヤモンド

あなたが正しいです。私はその質問を考慮して答えただけです。
Serhan C.

6

$ .getJSONを使用し、次に$ .eachを使用して、Key / valueのペアを反復します。JSONファイルと機能コードのコンテンツ例:

    {
        {
            "key": "INFO",
            "value": "This is an example."
        }
    }

    var url = "file.json";         
    $.getJSON(url, function (data) {
        $.each(data, function (key, model) {
            if (model.key == "INFO") {
                console.log(model.value)
            }
        })
    });

3

XMLHttpRequest()メソッドを使用できます。

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var myObj = JSON.parse(this.responseText);
        //console.log("Json parsed data is: " + JSON.stringify(myObj));
       }
    };
xmlhttp.open("GET", "your_file_name.json", true);
xmlhttp.send();

myObjの応答は、console.logステートメント(コメントアウト)を使用して確認できます。

AngularJSを知っている場合は、$ httpを使用できます。

MyController.$inject = ['myService'];
function MyController(myService){

var promise = myService.getJsonFileContents();

  promise.then(function (response) {
    var results = response.data;
    console.log("The JSON response is: " + JSON.stringify(results));
})
  .catch(function (error) {
    console.log("Something went wrong.");
  });
}

myService.$inject = ['$http'];
function myService($http){

var service = this;

  service.getJsonFileContents = function () {
    var response = $http({
      method: "GET",
      url: ("your_file_name.json")
    });

    return response;
  };
}

別のフォルダーにファイルがある場合は、ファイル名ではなく完全なパスを指定します。


2

Webアプリケーションがあるので、クライアントとサーバーがあるかもしれません。

ブラウザーのみがあり、ブラウザーで実行されているjavascriptからローカルファイルを読み取りたい場合は、クライアントしか存在しないことを意味します。セキュリティ上の理由から、ブラウザはそのようなことをさせてはいけません。

ただし、lauhubが上記で説明したように、これは機能するようです:

http://www.html5rocks.com/en/tutorials/file/dndfiles/

他の解決策は、マシンのどこかにWebサーバー(Windowsでは小さなもの、Linuxではmonkey)をセットアップし、XMLHttpRequestまたはD3ライブラリを使用して、サーバーからファイルを要求して読み取ることです。サーバーはローカルファイルシステムからファイルをフェッチし、Web経由で提供します。


1

Stano / Meetarが上でコメントしたことが好きでした。.jsonファイルの読み取りに使用します。私はPromiseを使用してそれらの例を拡張しました。これは同じためのプランカーです。 https://plnkr.co/edit/PaNhe1XizWZ7C0r3ZVQx?p=preview

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}

//usage:
// readTextFile("DATA.json", function(text){
//     var data = JSON.parse(text);
//     console.log(data); 
// });


var task1 = function (){
  return new Promise (function(resolve, reject){
    readTextFile("DATA.json", function(text){
    var data = JSON.parse(text);
    console.log('task1 called');
    console.log(data);
    resolve('task1 came back');
    }); 
  });
};

var task2 = function (){
  return new Promise (function(resolve, reject){
    readTextFile("DATA2.json", function(text){
    var data2 = JSON.parse(text);
    console.log('task2 called');
    console.log(data2);
    resolve('task2 came back');
    });
  });
}

Promise.race([task1(), task2()])
       .then(function(fromResolve){
          console.log(fromResolve); 
       });

JSONの読み取りは、DRYの別の関数に移動できます。ただし、ここでの例は、promiseの使い方を紹介するためのものです。


1

新しいXMLHttpRequestインスタンスを作成し、jsonファイルのコンテンツをロードする必要があります。

このヒントは私のために機能します(https://codepen.io/KryptoniteDove/post/load-json-file-locally-using-pure-javascript):

 function loadJSON(callback) {   

    var xobj = new XMLHttpRequest();
        xobj.overrideMimeType("application/json");
    xobj.open('GET', 'my_data.json', true); // Replace 'my_data' with the path to your file
    xobj.onreadystatechange = function () {
          if (xobj.readyState == 4 && xobj.status == "200") {
            // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
            callback(xobj.responseText);
          }
    };
    xobj.send(null);  
 }

 loadJSON(function(response) {
    // Parse JSON string into object
    var actual_JSON = JSON.parse(response);
 });

Firefoxでは引き続き機能しますが、Chromeでは機能しませんCross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https。あなたは使用することができjson2jsを .jsファイルに任意のJSONに変換します。
ラレングア

1

簡単な回避策の1つは、ローカルで実行されているサーバー内にJSONファイルを配置することです。そのためには、ターミナルからプロジェクトフォルダーに移動し、ローカルサーバーをポート番号8181などで起動します。

python -m SimpleHTTPServer 8181

次に、http:// localhost:8181 /にアクセスすると、JSONを含むすべてのファイルが表示されます。Pythonをまだインストールしていない場合は、忘れずにインストールしてください。



-1

data.json次のように、D3を使用してコールバックを処理し、ローカルJSONファイルをロードできます。

<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>

<script>
  d3.json("data.json", function(error, data) {
    if (error)
      throw error;
    console.log(data);
  });
</script>

-2

私はスタノの素晴らしい答えを受け取り、それを約束に包みました。これは、ファイルシステムからjsonファイルをロードするためにフォールバックするノードやWebパックのようなオプションがない場合に役立ちます。

// wrapped XMLHttpRequest in a promise
const readFileP = (file, options = {method:'get'}) => 
  new Promise((resolve, reject) => {
    let request = new XMLHttpRequest();
    request.onload = resolve;
    request.onerror = reject;
    request.overrideMimeType("application/json");
    request.open(options.method, file, true);
    request.onreadystatechange = () => {
        if (request.readyState === 4 && request.status === "200") {
            resolve(request.responseText);
        }
    };
    request.send(null);
});

次のように呼び出すことができます。

readFileP('<path to file>')
    .then(d => {
      '<do something with the response data in d.srcElement.response>'
    });

-4

したがって、JSONファイルをホストするために「Apache Tomcat」を使用することを計画している場合は、

1>サーバーを起動した後、次のURLにアクセスして、Apache Tomcatが稼働していることを確認します: "localhost:8080"-

ここに画像の説明を入力してください



2>次に、「webapps」フォルダーに移動します -「C:\ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ webapps」。そして、プロジェクトフォルダーを作成するか、プロジェクトフォルダーをコピーします。

ここに画像の説明を入力してください


3>そこにjsonファイルを貼り付けます。 ここに画像の説明を入力してください



4>以上です。完了です!-" http:// localhost:8080 / $ project_name $ / $ jsonFile_name $ .json"に移動しますここに画像の説明を入力してください


TomCatサーバーは要求されません
Chandra Kanth
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.