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?

user2864315
quelle

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/

Chris Pickford
quelle
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 .

Ashfedy
quelle
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".

Stano
quelle
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
34

Wenn in Node.js oder wenn require.js im Browser verwenden , können Sie einfach tun:

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

Beachten Sie: Die Datei wird einmal geladen, nachfolgende Aufrufe verwenden den Cache.

Musikformellons
quelle
2
Nicht wahr! Javascript hat keine eingebauten
1
@PauliSudarshanTerho Danke, du hast recht! Der Antwort wurden die Anforderungen von Node / require.js hinzugefügt.
Musikformellons
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);

 }
 

Syed Ayesha Bebe
quelle
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.

Alex Glinsky
quelle
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);
});
Sarah Cross
quelle
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);
Lauhub
quelle
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

user7394313
quelle
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"}]';
Antonio Carlos Del Grande Juni
quelle
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"
Serhan C.
quelle
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)
            }
        })
    });
Juan Carlos Aviles Lazcano
quelle
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.

Maharshi Rawal
quelle
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.

Antoni
quelle
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.

Plankton
quelle
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);
 });
rodrigomelo
quelle
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.

ewalel
quelle
0

Wenn Sie einen lokalen Webserver ausführen könnten (wie oben von Chris P vorgeschlagen) und jQuery verwenden könnten, könnten Sie http://api.jquery.com/jQuery.getJSON/ ausprobieren.

Nicolae Olariu
quelle
-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>
AlexG
quelle
-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>'
    });
ewilan
quelle
-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

Yash P Shah
quelle
Nicht nach TomCat Server gefragt
Chandra Kanth