Comment lire un fichier JSON local externe en JavaScript?

255

J'ai enregistré un fichier JSON dans mon système local et créé un fichier JavaScript afin de lire le fichier JSON et imprimer les données. Voici le fichier JSON:

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

Disons que c'est le chemin du fichier JSON: /Users/Documents/workspace/test.json.

Quelqu'un pourrait-il m'aider à rédiger un simple morceau de code pour lire le fichier JSON et imprimer les données en JavaScript?

user2864315
la source

Réponses:

93

Tu ne pouvez pas effectuer d'appel AJAX vers une ressource locale car la demande est effectuée à l'aide de HTTP.

Une solution de contournement consiste à exécuter un serveur Web local, à servir le fichier et à appeler AJAX vers localhost.

Pour vous aider à écrire du code pour lire JSON, vous devriez lire la documentation pour jQuery.getJSON():

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

Chris Pickford
la source
2
Pourriez-vous s'il vous plaît me guider comment je peux exécuter un serveur local dans ce cas? Que dois-je faire pour faire fonctionner le serveur local?
user2864315
2
Quel environnement utilisez-vous? Les fenêtres? Linux?
Chris Pickford
25
Cela n'est vrai que pour AJAX: sous Chrome et en utilisant l'API File de HTML5, je l'ai déjà fait. La question ne concernait pas AJAX.
lauhub
10
Si vous avez installé python, vous pouvez utiliser la ligne de commande python -m SimpleHTTPServer 8888et l'ouvrir http://localhost:8888/dans votre navigateur (Windows ou Mac). 8888est le port et peut être modifié.
geotheory
3
Pour mettre à jour le commentaire de @ geotheory, avec Python 3 la commande estpython -m http.server 8888
Marc Stober
193

Pour lire le fichier JSON local externe (data.json) à l'aide de javascript, créez d'abord votre fichier data.json:

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. Mentionnez le chemin du fichier json dans la source du script avec le fichier javascript.

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. Obtenez l'objet à partir du fichier json

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

Pour plus d'informations, consultez cette référence .

Ashfedy
la source
8
Cela fonctionne si vous pouvez modifier le fichier ou si le fichier n'a pas le JSON approprié comme contenu. Par exemple, l'exemple de contenu data.jsonci-dessus ne passe pas la validation: jsonlint.com car il s'agit vraiment de JavaScript. La suppression des guillemets simples enveloppants le transformerait en JavaScript pur.
Jason Aller
3
Remarque: JSON.parse n'est pas pris en charge dans certains navigateurs plus anciens (en vous regardant IE). Voir le tableau de compatibilité du navigateur de MDN pourwindow.JSON .
Sumner Evans
Ne devrait pas JSON.parse (data); ne fonctionne pas parce que les données sont une chaîne?
appelez-moi le
261
Ce n'est pas une bonne réponse. L'exemple dans la réponse ne charge pas un fichier json. Il s'agit simplement de charger un autre fichier javascript qui stocke du json codé en dur sous la forme d'une variable nommée data. Si vous avez supprimé les guillemets autour du json dansdata.json vous n'auriez même pas besoin de les utiliser JSON.parse. La question est de savoir comment charger un fichier JSON et non comment coder en dur JSON dans un autre fichier javascript, puis le charger.
wuliwong
1
JSON.parse(window.data);fournirait une meilleure information scopede la datavariable.
Akash
126

Le chargement d'un .jsonfichier à partir du disque dur est une opération asynchrone et doit donc spécifier une fonction de rappel à exécuter après le chargement du fichier.

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

Cette fonction fonctionne également pour charger un .html ou des .txtfichiers, en remplaçant le paramètre de type mime par "text/html", "text/plain"etc.

Stano
la source
14
C'est une très mauvaise pratique! Dans Google Chrome, vous ne pouvez pas effectuer de XmlHttpRequest sur une ressource locale.
mhaseeb
11
@mhaseeb Vous pouvez (même maintenant, à l'avenir), si la ressource a le même domaine / protocole que le système demandeur (ce qui sera le cas, car il est local). Recherchez CORS.
GreySage
11
en essayant cela avec Chrome actuel, j'obtiens "Les demandes d'origine croisée ne sont prises en charge que pour les schémas de protocole: http, data, chrome, chrome-extension, https." - donc pas de protocole de fichier, ce qui est sous-entendu ici @ GreySage
eis
2
XMLHttpRequest.status renvoie une valeur numérique. Cela ne fonctionne que parce que javascript fait des choses en arrière-plan pour que votre code ne meure pas. Devrait se lire comme suit: rawFile.status === 200
user3044394
1
Vous pouvez également définir de rawFile.responseType = 'json';sorte qu'il analyse automatiquement l'objet json, assurez-vous simplement de passer rawFile.responseau lieu de rawFile.responseTextle rappeler.
Ignat
34

Lorsque vous êtes dans Node.js ou lorsque vous utilisez require.js dans le navigateur , vous pouvez simplement faire:

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

Remarque: le fichier est chargé une fois, les appels suivants utiliseront le cache.

musicformellons
la source
2
Pas vrai! Javascript n'a pas besoin d'être intégré
1
@PauliSudarshanTerho Thx, vous avez raison! Ajout des exigences de Node / require.js à la réponse.
musicformellons
29
  1. Créez d'abord un fichier json. Dans cet exemple, mon fichier est 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. Et voici mon code, c'est-à-dire node.js. Notez l' 'utf8'argument à readFileSync: cela lui fait renvoyer non pas un Buffer(bien qu'il JSON.parsepuisse le gérer), mais une chaîne. Je crée un serveur pour voir le résultat ...

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. Lorsque vous souhaitez lire les détails d'un identifiant particulier, vous pouvez mentionner le code comme ..

 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. Lorsque vous avez entré l'URL, localhost:3030/get/33cela donnera les détails liés à cet identifiant .... et vous lisez également par nom. Mon fichier json a des noms simillar avec ce code, vous pouvez obtenir un nom de détail .... et il n'a pas imprimé tous les noms simillar

 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. Et si vous voulez lire les détails du nom de simillar, vous pouvez utiliser ce code.

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. Si vous souhaitez lire toutes les informations du fichier, utilisez ce code ci-dessous.

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

 }
 

Syed Ayesha Bebe
la source
d'où vient require ()? mon navigateur ne le trouve pas
shieldgenerator7
require () est une fonction intégrée.En utilisant require (), vous pouvez inclure des modules qui existent dans des fichiers séparés.La fonctionnalité de base de require est qu'il lit un fichier javascript, exécute le fichier, puis retourne l'objet exports
Syed Ayesha Bebe
5
require () est intégré à Node.js, il ne fait pas partie de js natif
dementis
Cette réponse ne montre pas comment charger un fichier en utilisant Vanilla Javascript, mais comment le faire en utilisant Node .js
Amos Long
18

L'utilisation de l' API Fetch est la solution la plus simple:

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

Cela fonctionne parfaitement dans Firefox, mais dans Chrome, vous devez personnaliser les paramètres de sécurité.

Alex Glinsky
la source
Lorsque j'essaie celui-ci, j'ai eu l'erreur suivante: (nœud: 2065) UnhandledPromiseRejectionWarning: Erreur: seules les URL absolues sont prises en charge
Jangid
13


Comme beaucoup de personnes l'ont mentionné auparavant, cela ne fonctionne pas en utilisant un appel AJAX. Cependant, il existe un moyen de contourner cela. À l'aide de l'élément d'entrée, vous pouvez sélectionner votre fichier.

Le fichier sélectionné (.json) doit avoir cette structure:

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


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

Ensuite, vous pouvez lire le fichier en utilisant JS avec 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);
});
Sarah Cross
la source
où mettez-vous le nom de votre dossier?
shieldgenerator7
1
Dans ce cas, l'utilisateur doit sélectionner le fichier lui-même en raison de la stratégie CORS, ce qui empêche essentiellement le développeur de la page Web de récupérer des données qu'il n'est pas censé (par exemple, je pourrais prendre ses fichiers privés, je pourrais faire un GET demande à un script potentiellement mauvais et exécutez-le sans l'autorisation de l'utilisateur). La politique CORS rend ce genre de choses difficile à gérer sans aucun type de backend, mais elle rend l'utilisateur plus sûr. Si vous souhaitez réellement ouvrir un fichier, vous devez exécuter un serveur Web qui peut gérer ces demandes.
Sarah Cross
12

Selon votre navigateur, vous pouvez accéder à vos fichiers locaux. Mais cela peut ne pas fonctionner pour tous les utilisateurs de votre application.

Pour ce faire, vous pouvez essayer les instructions à partir d'ici: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Une fois votre fichier chargé, vous pouvez récupérer les données en utilisant:

var jsonData = JSON.parse(theTextContentOfMyFile);
lauhub
la source
9

Si vous utilisez des fichiers locaux, pourquoi ne pas simplement empaqueter les données en tant qu'objet js?

data.js

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

Pas de XMLHttpRequests , pas d'analyse, utilisez simplement MyData.resourcedirectement

user7394313
la source
1
D'accord, mais veuillez compléter la partie MyData.resource pour que javascript montre plus clairement son utilisation. Merci.
Bay
9

Très simple.
Renommez votre fichier json en ".js" au lieu de ".json".

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

Suivez donc votre code normalement.

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

Cependant, juste pour information, le contenu de mon json ressemble au snip ci-dessous.

contacts='[{"name":"bla bla", "email":bla bla, "address":"bla bla"}]';
Antonio Carlos Del Grande Juni
la source
4
ce n'est pas un fichier json - c'est un fichier JS.
Karpik
9

Vous pouvez l'importer comme le module ES6;

import data from "/Users/Documents/workspace/test.json"
Serhan C.
la source
Alors, comment pouvez-vous importer un fichier json dynamique? Je pense que vous ne pouvez importer des fichiers json que lorsque vous êtes en mode développement par votre méthode.
Diamond
Vous avez raison. Je n'ai répondu qu'en considérant cette question.
Serhan C.
6

Utilisez simplement $ .getJSON puis $ .each pour itérer la paire clé / valeur. Exemple de contenu pour le fichier JSON et le code fonctionnel:

    {
        {
            "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
la source
3

Vous pouvez utiliser la méthode 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();

Vous pouvez voir la réponse de myObj à l'aide de l'instruction console.log (mise en commentaire).

Si vous connaissez AngularJS, vous pouvez utiliser $ 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;
  };
}

Si vous avez le fichier dans un autre dossier, mentionnez le chemin complet au lieu du nom de fichier.

Maharshi Rawal
la source
2

Puisque vous avez une application Web, vous pouvez avoir un client et un serveur.

Si vous ne disposez que de votre navigateur et que vous souhaitez lire un fichier local à partir d'un javascript qui s'exécute dans votre navigateur, cela signifie que vous n'avez qu'un client. Pour des raisons de sécurité, le navigateur ne doit pas vous laisser faire une telle chose.

Cependant, comme lauhub l'a expliqué ci-dessus, cela semble fonctionner:

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

Une autre solution consiste à configurer quelque part dans votre machine un serveur Web (minuscule dans Windows ou Monkey sous Linux) et avec une bibliothèque XMLHttpRequest ou D3, demandez le fichier au serveur et lisez-le. Le serveur récupérera le fichier du système de fichiers local et vous le servira via le Web.

Antoni
la source
1

J'ai aimé ce que Stano / Meetar a commenté ci-dessus. Je l'utilise pour lire des fichiers .json. J'ai développé leurs exemples en utilisant Promise. Voici le plongeur pour le même. 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 lecture de JSON peut être déplacée dans une autre fonction, pour DRY; mais l'exemple ici est plus de montrer comment utiliser les promesses.

Plancton
la source
1

Vous devez créer une nouvelle instance XMLHttpRequest et charger le contenu du fichier json.

Cette astuce fonctionne pour moi ( 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
la source
Fonctionne toujours sur Firefox mais pas sur Chrome: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. Vous pouvez utiliser json2js pour convertir n'importe quel fichier JSON en .JS.
lalengua
1

Une solution de contournement simple consiste à placer votre fichier JSON dans un serveur exécuté localement. pour cela depuis le terminal, allez dans votre dossier de projet et démarrez le serveur local sur un certain numéro de port, par exemple 8181

python -m SimpleHTTPServer 8181

Ensuite, la navigation vers http: // localhost: 8181 / devrait afficher tous vos fichiers, y compris le JSON. N'oubliez pas d'installer python si vous ne l'avez pas déjà fait.

ewalel
la source
-1

Vous pouvez utiliser D3 pour gérer le rappel et charger le fichier JSON local data.json, comme suit:

<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
la source
-2

J'ai pris l' excellente réponse de Stano et l' ai enveloppée dans une promesse. Cela peut être utile si vous ne disposez pas d'une option telle que node ou webpack sur laquelle se replier pour charger un fichier json à partir du système de fichiers:

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

Vous pouvez l'appeler comme ceci:

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

Donc, si vous prévoyez d'utiliser "Apache Tomcat" pour héberger votre fichier JSON,

1> Après avoir démarré le serveur, vérifiez que votre Apache Tomcat est opérationnel en allant à cette URL: "localhost: 8080" -

entrez la description de l'image ici



2> Ensuite, allez dans le dossier "webapps" - "C: \ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ webapps". Et créez un dossier de projet ou copiez votre dossier de projet.

entrez la description de l'image ici


3> Collez votre fichier json là-bas. entrez la description de l'image ici



4> Et c'est tout. Vous avez terminé! Allez simplement sur - " http: // localhost: 8080 / $ project_name $ / $ jsonFile_name $ .json"entrez la description de l'image ici

Yash P Shah
la source
Pas demandé de serveur TomCat
Chandra Kanth