Como ler um arquivo JSON local externo em JavaScript?

255

Salvei um arquivo JSON no meu sistema local e criei um arquivo JavaScript para ler o arquivo JSON e imprimir dados. Aqui está o arquivo JSON:

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

Digamos que este é o caminho do arquivo JSON: /Users/Documents/workspace/test.json .

Alguém poderia me ajudar a escrever um trecho de código simples para ler o arquivo JSON e imprimir os dados em JavaScript?

user2864315
fonte

Respostas:

93

Você não pode fazer uma chamada AJAX para um recurso local, pois a solicitação é feita usando HTTP.

Uma solução alternativa é executar um servidor da web local, servir o arquivo e fazer a chamada AJAX para o host local.

Em termos de ajudar a escrever código para ler JSON, você deve ler a documentação para jQuery.getJSON():

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

Chris Pickford
fonte
2
Você poderia me orientar como posso executar um servidor local nesse caso? O que preciso fazer para que o servidor local seja executado?
user2864315
2
Que ambiente você está usando? Janelas? Linux?
quer
25
Isso é verdade apenas para o AJAX: no Chrome e usando a API de arquivos do HTML5, eu já fiz isso. A questão não perguntou sobre o AJAX.
Lauhub 31/10/2013
10
Se você tem o python instalado, pode usar a linha de comando python -m SimpleHTTPServer 8888e abrir http://localhost:8888/no seu navegador (Windows ou Mac). 8888é a porta e pode ser alterada.
geotheory
3
Para atualizar o comentário da @ geotheory, com o Python 3 o comando épython -m http.server 8888
Marc Stober
193

Para ler o arquivo JSON local externo (data.json) usando javascript, primeiro crie seu arquivo data.json:

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. Mencione o caminho do arquivo json na fonte do script junto com o arquivo javascript.

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. Obter o objeto do arquivo json

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

Para mais informações, consulte esta referência .

Ashfedy
fonte
8
Isso funciona se você puder modificar o arquivo ou se o arquivo não tiver JSON apropriado como seu conteúdo. Por exemplo, o conteúdo de amostra data.jsonacima não passa na validação: jsonlint.com porque é realmente JavaScript. Soltar as aspas simples do invólucro o transformaria em JavaScript puro.
Jason Aller
3
Nota: JSON.parse não é suportado em alguns navegadores mais antigos (olhando para o IE). Consulte a tabela Compatibilidade do Navegador da MDN parawindow.JSON .
Sumner Evans
JSON.parse (data) não deve; não funciona porque os dados são uma string?
call-me
261
Esta não é uma resposta correta. O exemplo na resposta não está carregando um arquivo json. Na verdade, está apenas carregando outro arquivo javascript que armazena algum json codificado como uma variável chamada data. Se você removeu as aspas da string em torno do json, data.json você nem precisaria usar JSON.parse. A questão é como carregar um arquivo JSON e não como codificá-lo em outro arquivo javascript e, em seguida, carregá-lo.
wuliwong
1
JSON.parse(window.data);forneceria melhores informações scopesobre a datavariável.
Akash
126

O carregamento de um .jsonarquivo do disco rígido é uma operação assíncrona e, portanto, ele precisa especificar uma função de retorno de chamada a ser executada após o carregamento do arquivo.

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

Esta função também funciona para carregar um .htmlou .txtarquivos, substituindo o parâmetro mime type para "text/html", "text/plain"etc.

Stano
fonte
14
Esta é uma prática muito ruim! No Google Chrome, você não pode fazer um XmlHttpRequest em um recurso local.
precisa saber é
11
@mhaseeb Você pode (mesmo agora, no futuro), se o recurso tiver o mesmo domínio / protocolo que o sistema solicitante (o que ocorrerá, pois é local). Procure CORS.
precisa saber é o seguinte
11
ao tentar fazer isso com o Chrome atual, recebo "Solicitações de origem cruzada são compatíveis apenas com esquemas de protocolo: http, dados, chrome, extensão de cromo, https". - de modo nenhum protocolo de arquivo, o que está implícito aqui @GreySage
eis
2
XMLHttpRequest.status retorna um valor numérico. Isso só funciona porque o javascript está fazendo coisas em segundo plano para fazer com que seu código não morra. Deve ler da seguinte maneira: rawFile.status === 200
user3044394
1
Você também pode definir rawFile.responseType = 'json';para que ele analise o objeto json automaticamente, apenas certifique-se de passar em rawFile.responsevez de rawFile.responseTextpara o retorno de chamada.
Ignat
34

Quando estiver no Node.js ou ao usar o require.js no navegador , você pode simplesmente:

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

Observe: o arquivo é carregado uma vez, as chamadas subseqüentes usarão o cache.

musicformellons
fonte
2
Não é verdade! O Javascript não precisa ser incorporado
1
@PauliSudarshanTerho Thx, você está certo! Adicionados os requisitos de Node / require.js à resposta.
Musicformellons
29
  1. Primeiro, crie um arquivo json. Neste exemplo, meu arquivo é 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. E aqui está o meu código, ou seja, node.js. Observe o 'utf8'argumento para readFileSync: isso faz com que não retorne um Buffer(emboraJSON.parse possa lidar com isso), mas uma string. Estou criando um servidor para ver o resultado ...

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 você quiser ler detalhes específicos de identificação, pode mencionar o código como ..

 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 você digitou o URL, localhost:3030/get/33ele fornecerá os detalhes relacionados a esse ID .... e você também lerá pelo nome. Meu arquivo json tem nomes simillar com esse código, você pode obter detalhes de um nome .... e não imprimiu todos os nomes 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. E se você quiser ler detalhes do nome semelhante, poderá usar este código.

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 você quiser ler todas as informações no arquivo, use este código abaixo.

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

 }
 

Syed Ayesha Bebe
fonte
De onde vem o require ()? meu navegador não pode encontrá-lo
shieldgenerator7
A função básica do require é que ele lê um arquivo javascript, executa o arquivo e depois retorna o objeto de exportação
Syed Ayesha Bebe
5
require () está embutido no Node.js, não faz parte do js nativo
dementis
Esta resposta não mostra como carregar um arquivo usando Vanilla Javascript, mas como fazê-lo usando o Node .js
Amos Long
18

Usar a API de busca é a solução mais fácil:

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

Funciona perfeitamente no Firefox, mas no Chrome você precisa personalizar as configurações de segurança.

Alex Glinsky
fonte
Quando eu tentei este, recebi o seguinte erro: (nó: 2065) UnhandledPromiseRejectionWarning: Erro: apenas URLs absolutos são suportados
Jangid
13


Como muitas pessoas mencionaram antes, isso não funciona usando uma chamada AJAX. No entanto, há uma maneira de contornar isso. Usando o elemento de entrada, você pode selecionar seu arquivo.

O arquivo selecionado (.json) precisa ter esta estrutura:

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


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

Então você pode ler o arquivo usando JS com 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
fonte
onde você coloca o nome do seu arquivo?
usar o seguinte comando
1
Nesse caso, o usuário precisa selecionar o arquivo por causa da política do CORS, que basicamente impede que o desenvolvedor da página da Web capture dados que não deveriam (por exemplo, eu poderia pegar os arquivos privados deles, GET solicite um script potencialmente incorreto e execute-o sem a permissão do usuário). A política do CORS torna esse tipo de coisa difícil de lidar, sem nenhum tipo de back-end, mas torna o usuário mais seguro. Se você realmente deseja abrir um arquivo, precisará executar um servidor da Web que possa gerenciar essas solicitações.
Sarah Cruz
12

Dependendo do seu navegador, você pode acessar seus arquivos locais. Mas isso pode não funcionar para todos os usuários do seu aplicativo.

Para fazer isso, você pode tentar as instruções aqui: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Depois que seu arquivo é carregado, você pode recuperar os dados usando:

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

Se você estiver usando arquivos locais, por que não apenas empacotar os dados como um objeto js?

data.js

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

Sem XMLHttpRequests , sem análise, basta usar MyData.resourcediretamente

user7394313
fonte
1
Ok, mas você pode completar a parte MyData.resource para javascript, para mostrar seu uso mais claro. Obrigado.
Bay
9

Muito simples.
Renomeie seu arquivo json para ".js" em vez de ".json".

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

Portanto, siga seu código normalmente.

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

No entanto, apenas para obter informações, o conteúdo do meu json é semelhante ao snip abaixo.

contacts='[{"name":"bla bla", "email":bla bla, "address":"bla bla"}]';
Antonio Carlos Del Grande Juni
fonte
4
esse não é um arquivo json - é um arquivo JS.
Karpik
9

Você pode importá-lo como o módulo ES6;

import data from "/Users/Documents/workspace/test.json"
Serhan C.
fonte
Então, como você pode importar o arquivo json dinâmico? Eu acho que você só pode importar arquivos json apenas quando estiver no modo de desenvolvimento pelo seu método.
Diamante
Você está certo. Eu apenas respondi considerando essa pergunta.
Serhan C.
6

Basta usar $ .getJSON e, em seguida, $ .each para iterar o par Chave / valor. Exemplo de conteúdo para o arquivo JSON e o código funcional:

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

Você pode usar o método 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();

Você pode ver a resposta do myObj usando a instrução console.log (comentada).

Se você conhece o AngularJS, pode usar $ 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 você tiver o arquivo em uma pasta diferente, mencione o caminho completo em vez do nome do arquivo.

Maharshi Rawal
fonte
2

Como você possui um aplicativo Web, você pode ter um cliente e um servidor.

Se você possui apenas seu navegador e deseja ler um arquivo local de um javascript em execução no seu navegador, isso significa que você possui apenas um cliente. Por razões de segurança, o navegador não deve permitir que você faça isso.

No entanto, como o lauhub explicou acima, isso parece funcionar:

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

Outra solução é configurar em algum lugar da sua máquina um servidor Web (pequeno no Windows ou macaco no Linux) e com uma biblioteca XMLHttpRequest ou D3, solicitar o arquivo do servidor e lê-lo. O servidor buscará o arquivo no sistema de arquivos local e o servirá através da web.

Antoni
fonte
1

Gostei do que Stano / Meetar comentou acima. Eu o uso para ler arquivos .json. Expandi seus exemplos usando o Promise. Aqui está o plunker para o mesmo. 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); 
       });

A leitura do JSON pode ser movida para outra função, para DRY; mas o exemplo aqui é mais sobre como usar promessas.

Plâncton
fonte
1

Você deve criar uma nova instância XMLHttpRequest e carregar o conteúdo do arquivo json.

Esta dica funciona para mim ( 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
fonte
Ainda funciona no Firefox, mas não no Chrome: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. Você pode usar o json2js para converter qualquer arquivo JSON em .JS.
Lalengua 5/05
1

Uma solução simples é colocar o arquivo JSON em um servidor em execução local. para isso, no terminal, vá para a pasta do seu projeto e inicie o servidor local em algum número de porta, por exemplo, 8181

python -m SimpleHTTPServer 8181

Em seguida, navegando para http: // localhost: 8181 / deve exibir todos os seus arquivos, incluindo o JSON. Lembre-se de instalar o python se você ainda não o possui.

ewalel
fonte
-1

Você pode usar o D3 para manipular o retorno de chamada e carregar o arquivo JSON local data.json, da seguinte maneira:

<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
fonte
-2

Peguei a excelente resposta de Stano e a envolvi em uma promessa. Isso pode ser útil se você não tiver uma opção como node ou webpack para voltar a carregar um arquivo json no sistema de arquivos:

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

Você pode chamar assim:

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

Portanto, se você planeja usar o "Apache Tomcat" para hospedar seu arquivo JSON,

1> Após iniciar o servidor, verifique se o Apache Tomcat está em funcionamento, acessando este URL: "localhost: 8080" -

insira a descrição da imagem aqui



2> Em seguida, vá para a pasta "webapps" - "C: \ Arquivos de Programas \ Apache Software Foundation \ Tomcat 8.5 \ webapps". E, crie uma pasta de projeto ou copie sua pasta de projeto.

insira a descrição da imagem aqui


3> Cole o seu arquivo json por lá. insira a descrição da imagem aqui



4> E é isso. Você terminou! Basta ir para - " http: // localhost: 8080 / $ project_name $ / $ jsonFile_name $ .json"insira a descrição da imagem aqui

Yash P Shah
fonte
Não foi solicitado o servidor TomCat
Chandra Kanth 14/03