Estou tentando carregar um arquivo .json em uma variável em javascript, mas não consigo fazer funcionar. Provavelmente é apenas um pequeno erro, mas não consigo encontrar.
Tudo funciona bem quando uso dados estáticos como este:
var json = {
id: "whatever",
name: "start",
children: [{
"id": "0.9685",
"name": " contents:queue"
}, {
"id": "0.79281",
"name": " contents:mqq_error"
}
}]
}
Coloquei tudo o que está em {}
um content.json
arquivo e tentei carregá-lo em uma variável JavaScript local, conforme explicado aqui: load json into variable .
var json = (function() {
var json = null;
$.ajax({
'async': false,
'global': false,
'url': "/content.json",
'dataType': "json",
'success': function(data) {
json = data;
}
});
return json;
})();
Eu o executei com o depurador do Chrome e ele sempre me diz que o valor da variável json
é null
. O content.json
arquivo reside no mesmo diretório do arquivo .js que o chama.
O que eu perdi?
javascript
jquery
json
PogoMips
fonte
fonte
/content.json
que significa que o arquivo está no nível raiz do seu aplicativo da web. Mude paracontent.json
(sem barra) para apontá-lo no mesmo diretório onde seu arquivo de script está colocado. Apenas no caso de seu arquivo de script estar no diretório de nível raiz, ele funcionará.Respostas:
Se você colou seu objeto
content.json
diretamente, ele é JSON inválido. Chaves e valores JSON devem ser colocados entre aspas duplas ("
não'
), a menos que o valor seja numérico, booleanonull
ou composto (matriz ou objeto). JSON não pode conter funções ouundefined
valores. Abaixo está o seu objeto como JSON válido.Você também teve um extra
}
.fonte
Minha solução, conforme respondida aqui , é usar:
O arquivo é carregado apenas uma vez, outras solicitações usam o cache.
editar Para evitar o armazenamento em cache, aqui está a função auxiliar desta postagem do blog fornecida nos comentários, usando o
fs
módulo:fonte
Para ES6 / ES2015 você pode importar diretamente como:
Se você usa Typescript, pode declarar o módulo json como:
Desde Typescript 2.9+ você pode adicionar - resolveJsonModule compilerOptions em
tsconfig.json
fonte
Uncaught SyntaxError: Unexpected token *
data
um módulo, masdata.default
é o objetoSyntaxError: Unexpected token *
import * as data from './example.json'
devido a um erro de tipo mime.import * as data from './example.json';
entãodata
é apenas módulo, masdata.default
é o objeto. Mas quando eu usoimport data from './example.json';
, em seguida,data
é o objeto, que é mais applicapableExistem dois problemas possíveis:
AJAX é assíncrono, portanto,
json
será indefinido quando você retornar da função externa. Quando o arquivo for carregado, a função de retorno de chamada será definidajson
para algum valor, mas naquele momento, ninguém se importa mais.Vejo que você tentou consertar isso com
'async': false
. Para verificar se isso funciona, adicione esta linha ao código e verifique o console do seu navegador:O caminho pode estar errado. Use o mesmo caminho que você usou para carregar seu script no documento HTML. Então, se o seu script for
js/script.js
, usejs/content.json
Alguns navegadores podem mostrar quais URLs eles tentaram acessar e como isso aconteceu (códigos de sucesso / erro, cabeçalhos HTML, etc). Verifique as ferramentas de desenvolvimento do seu navegador para ver o que acontece.
fonte
O módulo node.js integrado fs fará isso de forma assíncrona ou síncrona, dependendo de suas necessidades.
Você pode carregá-lo usando
var fs = require('fs');
Assíncrono
Síncrono
fonte
Para o formato json fornecido como no arquivo ~ / my-app / src / db / abc.json:
para importar para um arquivo .js como ~ / my-app / src / app.js:
Resultado:
fonte