Come leggere un file JSON locale esterno in JavaScript?


255

Ho salvato un file JSON nel mio sistema locale e creato un file JavaScript per leggere il file JSON e stampare i dati. Ecco il file JSON:

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

Diciamo che questo è il percorso del file JSON: /Users/Documents/workspace/test.json.

Qualcuno potrebbe aiutarmi a scrivere un semplice codice per leggere il file JSON e stampare i dati in JavaScript?


Risposte:


93

Non è possibile effettuare una chiamata AJAX a una risorsa locale poiché la richiesta viene effettuata tramite HTTP.

Una soluzione alternativa consiste nell'eseguire un server Web locale, servire il file ed effettuare la chiamata AJAX a localhost.

Per aiutarti a scrivere codice per leggere JSON, dovresti leggere la documentazione per jQuery.getJSON():

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


2
Potresti guidarmi per favore come posso eseguire un server locale in questo caso? Cosa devo fare per far funzionare il server locale?
user2864315

2
Quale ambiente stai usando? Finestre? Linux?
Chris Pickford,

25
Questo è vero solo per AJAX: sotto Chrome e usando l'API File HTML5 l'ho già fatto. La domanda non è stata posta su AJAX.
lauhub,

10
Se hai installato Python puoi usare la riga di comando python -m SimpleHTTPServer 8888e aprire http://localhost:8888/nel tuo browser (Windows o Mac). 8888è la porta e può essere modificata.
geoteca il

3
Per aggiornare il commento di @ geotheory, con Python 3 il comando èpython -m http.server 8888
Marc Stober,

193

Per leggere il file JSON locale esterno (data.json) utilizzando javascript, creare innanzitutto il file data.json:

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. Indica il percorso del file json nell'origine dello script insieme al file javascript.

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. Ottieni l'oggetto dal file json

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

Per ulteriori informazioni, consultare questo riferimento .


8
Funziona se è possibile modificare il file o se il file non ha JSON corretto come contenuto. Ad esempio, il contenuto di esempio data.jsonsopra non passa la convalida: jsonlint.com perché è davvero JavaScript. Eliminare le virgolette singole avvolgenti lo trasformerebbe in puro JavaScript.
Jason Aller,

3
Nota: JSON.parse non è supportato in alcuni browser meno recenti (ti guarda IE). Vedere la tabella di compatibilità del browser MDN perwindow.JSON .
Sumner Evans,

Non dovrei JSON.parse (dati); non funziona perché i dati sono una stringa?
chiamami il

261
Questa non è una risposta corretta L'esempio nella risposta non sta caricando un file json. In realtà sta solo caricando un altro file javascript che memorizza alcuni json hardcoded come variabile denominata data. Se hai rimosso le virgolette di stringa da tutto il json data.json non avresti nemmeno bisogno di usare JSON.parse. La domanda è come caricare un file JSON non come codificare JSON in un altro file javascript e quindi caricarlo.
wuliwong,

1
JSON.parse(window.data);fornirebbe una migliore informazione scopesulla datavariabile.
Akash,

126

Il caricamento di un .jsonfile dal disco fisso è un'operazione asincrona e pertanto deve specificare una funzione di callback da eseguire dopo il caricamento del file.

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

Questa funzione funziona anche per caricare un file .htmlo .txt, sovrascrivendo il parametro mime type su "text/html", "text/plain"ecc.


14
Questa è una brutta pratica! In Google Chrome, non è possibile effettuare un XmlHttpRequest a una risorsa locale.
mhaseeb,

11
@mhaseeb È possibile (anche ora, in futuro), se la risorsa ha lo stesso dominio / protocollo del sistema richiedente (cosa che sarà, poiché è locale). Cerca CORS.
GreySage,

11
provando questo con l'attuale Chrome, ottengo "Le richieste di origine incrociata sono supportate solo per gli schemi di protocollo: http, dati, chrome, chrome-extension, https." - quindi nessun protocollo di file, che è implicito qui @GreySage
eis

2
XMLHttpRequest.status restituisce un valore numerico. Questo funziona solo perché javascript sta facendo cose in background per non far morire il tuo codice. Si legge come segue: rawFile.status === 200
user3044394

1
È inoltre possibile impostare rawFile.responseType = 'json';in modo che analizza l'oggetto JSON automaticamente, basta assicurarsi di passare rawFile.responseinvece rawFile.responseTextal callback.
Ignat,


29
  1. Innanzitutto, crea un file json. In questo esempio il mio file è 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. Ed ecco il mio codice, ad esempio, node.js. Nota l' 'utf8'argomento a readFileSync: questo lo fa restituire non un Buffer(sebbene JSON.parsepossa gestirlo), ma una stringa. Sto creando un server per vedere il risultato ...

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. Quando vuoi leggere particolari dettagli ID puoi menzionare il codice come ..

 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. Quando hai inserito l'URL in localhost:3030/get/33quanto fornirà i dettagli relativi a quell'ID .... e leggi anche per nome. Il mio file json ha nomi simili con questo codice è possibile ottenere i dettagli di un nome .... e non ha stampato tutti i nomi simili

 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. E se vuoi leggere i dettagli del nome simile, puoi usare questo codice.

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. Se vuoi leggere tutte le informazioni nel file, usa questo codice qui sotto.

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

 }
 


da dove viene richiesto ()? il mio browser non riesce a trovarlo
shieldgenerator7

require () è la funzione integrata. Usando request () è possibile includere moduli esistenti in file separati. La funzionalità di base di request è che legge un file javascript, esegue il file e quindi procede a restituire l'oggetto di esportazione
Syed Ayesha Bebe

5
require () è integrato in Node.js, non fa parte del js nativo
demenza

Questa risposta non mostra come caricare un file usando Vanilla Javascript, ma come farlo usando Nodo .js
Amos Long

18

L'utilizzo dell'API Fetch è la soluzione più semplice:

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

Funziona perfettamente in Firefox, ma in Chrome devi personalizzare le impostazioni di sicurezza.


Quando provo questo ho avuto il seguente errore: (nodo: 2065) UnhandledPromiseRejectionWarning: Errore: sono supportati solo gli URL assoluti
Jangid

13


Come molte persone menzionate prima, questo non funziona usando una chiamata AJAX. Tuttavia, c'è un modo per aggirare. Utilizzando l'elemento di input, è possibile selezionare il file.

Il file selezionato (.json) deve avere questa struttura:

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


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

Quindi puoi leggere il file usando JS con 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);
});

dove metti il ​​nome del tuo file?
shieldgenerator7,

1
In questo caso, l'utente deve selezionare il file da solo a causa della politica CORS, che sostanzialmente impedisce allo sviluppatore della pagina Web di acquisire dati che non dovrebbero (es. Potrei prendere i loro file privati, potrei fare un OTTIENI la richiesta per uno script potenzialmente errato ed eseguilo senza l'autorizzazione dell'utente). La politica CORS rende questo tipo di cose un problema da affrontare senza alcun tipo di back-end, ma rende l'utente più sicuro. Se si desidera effettivamente aprire un file, è necessario eseguire un server Web in grado di gestire tali richieste.
Sarah Cross,

12

A seconda del browser, è possibile accedere ai file locali. Ma questo potrebbe non funzionare per tutti gli utenti della tua app.

Per fare ciò, puoi provare le istruzioni da qui: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Una volta caricato il file, è possibile recuperare i dati utilizzando:

var jsonData = JSON.parse(theTextContentOfMyFile);

9

Se stai usando file locali, perché non impacchettare i dati come un oggetto js?

data.js

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

Nessun XMLHttpRequests , nessuna analisi, basta usare MyData.resourcedirettamente


1
Ok, ma potresti per favore completare la parte MyData.resource per javascript per mostrare il suo utilizzo per essere più chiari. Grazie.
Baia,

9

Molto semplice.
Rinomina il tuo file json in ".js" anziché ".json".

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

Quindi segui normalmente il tuo codice.

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

Tuttavia, solo per informazione, il contenuto del mio JSON sembra il taglio qui sotto.

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

4
non è un file JSON, è un file JS.
Karpik,

9

Puoi importarlo come il modulo ES6;

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

Quindi come puoi importare il file json dinamico? Penso che puoi importare file JSON solo quando sei in modalità di sviluppo con il tuo metodo.
Diamante

Hai ragione. Ho solo risposto considerando quella domanda.
Serhan C.

6

Basta usare $ .getJSON e poi $ .each per ripetere la coppia chiave / valore. Esempio di contenuto per il file JSON e il codice funzionale:

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

È possibile utilizzare il metodo 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();

Puoi vedere la risposta di myObj usando l'istruzione console.log (commentata).

Se conosci AngularJS, puoi usare $ 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;
  };
}

Se il file è presente in una cartella diversa, indicare il percorso completo anziché il nome file.


2

Dato che hai un'applicazione web, potresti avere un client e un server.

Se hai solo il tuo browser e vuoi leggere un file locale da un javascript in esecuzione nel tuo browser, ciò significa che hai solo un client. Per motivi di sicurezza, il browser non dovrebbe lasciarti fare.

Tuttavia, come spiegato in precedenza lauhub, questo sembra funzionare:

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

Un'altra soluzione è quella di installare da qualche parte nel tuo computer un server web (piccolo in Windows o Monkey in Linux) e con una libreria XMLHttpRequest o D3, richiedere il file dal server e leggerlo. Il server recupererà il file dal filesystem locale e te lo servirà attraverso il web.


1

Mi è piaciuto quello che Stano / Meetar ha commentato sopra. Lo uso per leggere file .json. Ho ampliato i loro esempi usando Promise. Ecco il plunker per lo stesso. 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); 
       });

La lettura di JSON può essere spostata in un'altra funzione, per DRY; ma l'esempio qui è più di mostrare come usare le promesse.


1

È necessario creare una nuova istanza XMLHttpRequest e caricare il contenuto del file json.

Questo suggerimento funziona per me ( 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);
 });

Funziona ancora su Firefox, ma non lo fa su Chrome: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. È possibile utilizzare json2js per convertire qualsiasi file JSON in file .JS.
lalengua,

1

Una soluzione semplice è quella di inserire il file JSON all'interno di un server locale. dal terminale vai alla cartella del tuo progetto e avvia il server locale su un numero di porta, ad es. 8181

python -m SimpleHTTPServer 8181

Quindi navigare su http: // localhost: 8181 / dovrebbe visualizzare tutti i tuoi file incluso JSON. Ricorda di installare Python se non l'hai già fatto.



-1

È possibile utilizzare D3 per gestire il callback e caricare il file JSON locale data.json, come segue:

<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

Ho preso l' eccellente risposta di Stano e l'ho avvolta in una promessa. Questo potrebbe essere utile se non hai un'opzione come node o webpack su cui ripiegare per caricare un file json dal file system:

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

Puoi chiamarlo così:

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

-4

Pertanto, se hai intenzione di utilizzare "Apache Tomcat" per l'hosting del tuo file JSON,

1> Dopo aver avviato il server, verifica che Apache Tomcat sia attivo e funzionante andando a questo url: "localhost: 8080" -

inserisci qui la descrizione dell'immagine



2> Quindi, vai alla cartella "webapps" - "C: \ Programmi \ Apache Software Foundation \ Tomcat 8.5 \ webapps". E crea una cartella di progetto o copia la cartella di progetto.

inserisci qui la descrizione dell'immagine


3> Incolla il tuo file json laggiù. inserisci qui la descrizione dell'immagine



4> E questo è tutto. Hai fatto! Vai a - " http: // localhost: 8080 / $ nome_progetto $ / $ jsonNome_file $ .json"inserisci qui la descrizione dell'immagine


Non richiesto per il server TomCat
Chandra Kanth
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.