Wie lese ich eine externe lokale JSON-Datei in JavaScript?


255

Ich habe eine JSON-Datei in meinem lokalen System gespeichert und eine JavaScript-Datei erstellt, um die JSON-Datei zu lesen und Daten auszudrucken. Hier ist die JSON-Datei:

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

Angenommen, dies ist der Pfad der JSON-Datei : /Users/Documents/workspace/test.json.

Könnte mir bitte jemand helfen, einen einfachen Code zu schreiben, um die JSON-Datei zu lesen und die Daten in JavaScript zu drucken?


Antworten:


93

Sie können eine lokale Ressource nicht mit AJAX aufrufen, da die Anforderung über HTTP erfolgt.

Eine Problemumgehung besteht darin, einen lokalen Webserver auszuführen, die Datei bereitzustellen und den AJAX-Aufruf an localhost durchzuführen.

Um Ihnen beim Schreiben von Code zum Lesen von JSON zu helfen, sollten Sie die Dokumentation lesen für jQuery.getJSON():

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


2
Könnten Sie mir bitte zeigen, wie ich in diesem Fall einen lokalen Server betreiben kann? Was muss ich tun, damit der lokale Server ausgeführt wird?
user2864315

2
Welche Umgebung verwenden Sie? Windows? Linux?
Chris Pickford

25
Dies gilt nur für AJAX: Unter Chrome und unter Verwendung der Datei-API von HTML5 habe ich dies bereits getan. Die Frage wurde nicht nach AJAX gestellt.
Lauhub

10
Wenn Sie Python installiert haben, können Sie die Befehlszeile verwenden python -m SimpleHTTPServer 8888und http://localhost:8888/in Ihrem Browser (Windows oder Mac) öffnen . 8888ist der Port und kann geändert werden.
Geotheory

3
Um @ geotheorys Kommentar zu aktualisieren, lautet der Befehl mit Python 3python -m http.server 8888
Marc Stober

192

Um die externe lokale JSON-Datei (data.json) mit Javascript zu lesen, erstellen Sie zunächst Ihre Datei data.json:

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. Erwähnen Sie den Pfad der JSON-Datei in der Skriptquelle zusammen mit der Javascript-Datei.

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. Holen Sie sich das Objekt aus der JSON-Datei

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

Weitere Informationen finden Sie in dieser Referenz .


8
Dies funktioniert, wenn Sie die Datei ändern können oder wenn die Datei nicht über den richtigen JSON-Inhalt verfügt. Zum Beispiel besteht der Beispielinhalt für data.jsonoben keine Validierung: jsonlint.com, da es sich wirklich um JavaScript handelt. Wenn Sie die einfachen Anführungszeichen löschen, wird daraus reines JavaScript.
Jason Aller

3
Hinweis: JSON.parse Wird in einigen älteren Browsern nicht unterstützt (siehe IE). Weitere Informationen finden Sie in der Browserkompatibilitätstabelle von MDNwindow.JSON .
Sumner Evans

Sollte nicht JSON.parse (Daten); nicht funktionieren, weil Daten eine Zeichenfolge sind?
Rufen Sie mich

260
Dies ist keine richtige Antwort. Das Beispiel in der Antwort lädt keine JSON-Datei. Es wird tatsächlich nur eine andere Javascript-Datei geladen, in der ein fest codierter JSON als Variable mit dem Namen gespeichert ist data. Wenn Sie die Zeichenfolgen in der Umgebung des JSONs entfernen data.json würden, müssten Sie sie nicht einmal verwenden JSON.parse. Die Frage ist, wie eine JSON-Datei geladen wird und nicht, wie JSON in eine andere Javascript-Datei fest codiert und dann geladen wird.
Wuliwong

1
JSON.parse(window.data);würde bessere Informationen scopeüber die dataVariable liefern .
Akash

126

Das Laden einer .jsonDatei von der Festplatte ist eine asynchrone Operation und muss daher eine Rückruffunktion angeben, die nach dem Laden der Datei ausgeführt werden soll.

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

Diese Funktion funktioniert auch zum Laden von a .htmloder .txtDateien, indem der Parameter mime type to usw. überschrieben "text/html"wird "text/plain".


14
Dies ist eine sehr schlechte Praxis! In Google Chrome können Sie keine XmlHttpRequest für eine lokale Ressource erstellen.
Mhaseeb

11
@mhaseeb Sie können (auch jetzt, in Zukunft), wenn die Ressource dieselbe Domäne / dasselbe Protokoll wie das anfordernde System hat (was dies auch tun wird, da es lokal ist). CORS nachschlagen.
GreySage

11
Wenn ich dies mit dem aktuellen Chrome versuche, erhalte ich die Meldung "Ursprungsübergreifende Anforderungen werden nur für Protokollschemata unterstützt: http, data, chrome, chrome-extension, https." - also keine Datei - Protokoll, das hier @GreySage impliziert
uvb

2
XMLHttpRequest.status gibt einen numerischen Wert zurück. Dies funktioniert nur, weil Javascript Dinge im Hintergrund tut, damit Ihr Code nicht stirbt. Sollte wie folgt lauten: rawFile.status === 200
user3044394

1
Sie können auch einstellen , rawFile.responseType = 'json';so dass es das JSON - Objekt analysiert automatisch, nur um sicher zu machen passieren , rawFile.responseanstatt rawFile.responseTextauf den Rückruf.
Ignat


29
  1. Erstellen Sie zunächst eine JSON-Datei. In diesem Beispiel lautet meine Datei 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. Und hier ist mein Code, dh node.js. Beachten Sie das 'utf8'Argument zu readFileSync: Dadurch wird nicht ein Buffer(obwohl JSON.parsedamit umgehen kann), sondern ein String zurückgegeben. Ich erstelle einen Server, um das Ergebnis zu sehen ...

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. Wenn Sie bestimmte ID-Details lesen möchten, können Sie den Code als ..

 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. Wenn Sie eine URL eingegeben localhost:3030/get/33haben, werden die Details zu dieser ID angezeigt ... und Sie lesen auch mit Namen. Meine JSON-Datei hat ähnliche Namen. Mit diesem Code können Sie Details zu einem Namen abrufen. Es wurden nicht alle ähnlichen Namen gedruckt

 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. Und wenn Sie ähnliche Namensdetails lesen möchten, können Sie diesen Code verwenden.

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. Wenn Sie alle Informationen in der Datei lesen möchten, verwenden Sie diesen Code unten.

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

 }
 


Woher kommt require ()? Mein Browser kann es nicht finden
Shieldgenerator7

require () ist eine integrierte Funktion. Mit require () können Sie Module einschließen, die in separaten Dateien vorhanden sind. Die grundlegende Funktionalität von require besteht darin, dass eine Javascript-Datei gelesen, die Datei ausgeführt und anschließend das Exportobjekt
Syed Ayesha Bebe - zurückgegeben wird

5
require () ist in Node.js integriert, es ist nicht Teil von native js
dementis

Diese Antwort zeigt nicht, wie eine Datei mit Vanilla Javascript geladen wird, sondern wie man dies mit Node .js
Amos Long

18

Die Verwendung der Fetch-API ist die einfachste Lösung:

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

Es funktioniert perfekt in Firefox, aber in Chrome müssen Sie die Sicherheitseinstellungen anpassen.


Wenn ich diesen versuche, habe ich folgenden Fehler erhalten: (Knoten: 2065) UnhandledPromiseRejectionWarning: Fehler: Es werden nur absolute URLs unterstützt
Jangid

13


Wie bereits erwähnt, funktioniert dies mit einem AJAX-Aufruf nicht. Es gibt jedoch einen Weg, dies zu umgehen. Mit dem Eingabeelement können Sie Ihre Datei auswählen.

Die ausgewählte Datei (.json) muss folgende Struktur haben:

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


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

Dann können Sie die Datei mit JS mit FileReader () lesen:

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

Wo geben Sie den Namen Ihrer Datei ein?
Schildgenerator7

1
In diesem Fall muss der Benutzer die Datei aufgrund der CORS-Richtlinie selbst auswählen, wodurch der Entwickler der Webseite grundsätzlich daran gehindert wird, Daten abzurufen, die er nicht sollte (z. B. könnte ich seine privaten Dateien nehmen, ich könnte eine erstellen GET-Anfrage an ein möglicherweise fehlerhaftes Skript und führen Sie es ohne die Erlaubnis des Benutzers aus. Die CORS-Richtlinie macht diese Art von Dingen ohne Backend zu einem Problem, macht den Benutzer jedoch sicherer. Wenn Sie eine Datei tatsächlich öffnen möchten, müssen Sie einen Webserver ausführen, der diese Anforderungen verwalten kann.
Sarah Cross

12

Abhängig von Ihrem Browser können Sie auf Ihre lokalen Dateien zugreifen. Dies funktioniert jedoch möglicherweise nicht für alle Benutzer Ihrer App.

Zu diesem Zweck können Sie die Anweisungen hier ausprobieren: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Sobald Ihre Datei geladen ist, können Sie die Daten abrufen mit:

var jsonData = JSON.parse(theTextContentOfMyFile);

9

Wenn Sie lokale Dateien verwenden, packen Sie die Daten einfach als js-Objekt.

data.js

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

Keine XMLHttpRequests , keine Analyse, nur MyData.resourcedirekt verwenden


1
Okay, aber bitte vervollständigen Sie den Teil MyData.resource für Javascript, um die Verwendung klarer darzustellen. Vielen Dank.
Bucht

9

Sehr einfach.
Benennen Sie Ihre JSON-Datei in ".js" anstelle von ".json" um.

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

Folgen Sie also Ihrem Code normal.

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

Nur zur Information, der Inhalt meines json sieht aus wie der Snip unten.

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

4
Das ist keine JSON-Datei - das ist eine JS-Datei.
Karpik

9

Sie können es wie ein ES6-Modul importieren.

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

Wie können Sie dann eine dynamische JSON-Datei importieren? Ich denke, Sie können JSON-Dateien nur importieren, wenn Sie sich nach Ihrer Methode im Entwicklungsmodus befinden.
Diamond

Du hast recht. Ich habe nur unter Berücksichtigung dieser Frage geantwortet.
Serhan C.

6

Verwenden Sie einfach $ .getJSON und dann $ .each, um das Paar Schlüssel / Wert zu iterieren. Inhaltsbeispiel für die JSON-Datei und den Funktionscode:

    {
        {
            "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

Sie können die XMLHttpRequest () -Methode verwenden:

    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();

Sie können die Antwort von myObj mithilfe der Anweisung console.log sehen (auskommentiert).

Wenn Sie AngularJS kennen, können Sie $ http verwenden:

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

Wenn Sie die Datei in einem anderen Ordner haben, geben Sie den vollständigen Pfad anstelle des Dateinamens an.


2

Da Sie eine Webanwendung haben, haben Sie möglicherweise einen Client und einen Server.

Wenn Sie nur Ihren Browser haben und eine lokale Datei aus einem Javascript lesen möchten, das in Ihrem Browser ausgeführt wird, bedeutet dies, dass Sie nur einen Client haben. Aus Sicherheitsgründen sollte der Browser dies nicht zulassen.

Wie Lauhub oben erklärt hat, scheint dies jedoch zu funktionieren:

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

Eine andere Lösung besteht darin, irgendwo auf Ihrem Computer einen Webserver einzurichten (winzig in Windows oder Monkey in Linux) und mit einer XMLHttpRequest- oder D3-Bibliothek die Datei vom Server anzufordern und zu lesen. Der Server ruft die Datei aus dem lokalen Dateisystem ab und stellt sie Ihnen über das Web zur Verfügung.


1

Mir hat gefallen, was Stano / Meetar oben kommentiert hat. Ich benutze es, um .json-Dateien zu lesen. Ich habe ihre Beispiele mit Promise erweitert. Hier ist der Plunker dafür. 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); 
       });

Das Lesen von JSON kann für DRY in eine andere Funktion verschoben werden. Das Beispiel hier zeigt jedoch eher, wie man Versprechen einsetzt.


1

Sie müssen eine neue XMLHttpRequest-Instanz erstellen und den Inhalt der JSON-Datei laden.

Dieser Tipp funktioniert für mich ( 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);
 });

Funktioniert immer noch unter Firefox, aber nicht unter Chrome : Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. Sie können json2js verwenden , um eine beliebige JSON-Datei in eine JS-Datei zu konvertieren.
Lalengua

1

Eine einfache Problemumgehung besteht darin, Ihre JSON-Datei auf einem lokal ausgeführten Server abzulegen. Gehen Sie dazu vom Terminal in Ihren Projektordner und starten Sie den lokalen Server an einer Portnummer, z. B. 8181

python -m SimpleHTTPServer 8181

Wenn Sie dann zu http: // localhost: 8181 / navigieren, sollten alle Ihre Dateien einschließlich des JSON angezeigt werden. Denken Sie daran, Python zu installieren, falls Sie dies noch nicht getan haben.



-1

Sie können D3 verwenden, um den Rückruf zu verarbeiten und die lokale JSON-Datei data.jsonwie folgt zu laden :

<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

Ich nahm Stanos ausgezeichnete Antwort und wickelte sie in ein Versprechen ein. Dies kann nützlich sein, wenn Sie keine Option wie Node oder Webpack haben, auf die Sie zurückgreifen können, um eine JSON-Datei aus dem Dateisystem zu laden:

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

Sie können es so nennen:

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

-3

Wenn Sie also planen, "Apache Tomcat" zum Hosten Ihrer JSON-Datei zu verwenden,

1> Überprüfen Sie nach dem Starten des Servers, ob Ihr Apache Tomcat betriebsbereit ist, indem Sie zu dieser URL gehen: "localhost: 8080" -

Geben Sie hier die Bildbeschreibung ein



2> Wechseln Sie als Nächstes zum Ordner "webapps" - "C: \ Programme \ Apache Software Foundation \ Tomcat 8.5 \ webapps". Erstellen Sie einen Projektordner oder kopieren Sie Ihren Projektordner.

Geben Sie hier die Bildbeschreibung ein


3> Fügen Sie dort Ihre JSON-Datei ein. Geben Sie hier die Bildbeschreibung ein



4> Und das war's. Du bist fertig! Gehen Sie einfach zu - " http: // localhost: 8080 / $ project_name $ / $ jsonFile_name $ .json"Geben Sie hier die Bildbeschreibung ein


Nicht nach TomCat Server gefragt
Chandra Kanth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.