Cargue el archivo JSON local en la variable


113

Estoy tratando de cargar un archivo .json en una variable en javascript, pero no puedo hacer que funcione. Probablemente sea solo un error menor, pero no puedo encontrarlo.

Todo funciona bien cuando uso datos estáticos como este:

var json = {
  id: "whatever",
  name: "start",
  children: [{
      "id": "0.9685",
      "name": " contents:queue"
    }, {
      "id": "0.79281",
      "name": " contents:mqq_error"
    }
  }]
}

Puse todo lo que está en {}un content.jsonarchivo e intenté cargarlo en una variable de JavaScript local como se explica aquí: cargar json en variable .

var json = (function() {
  var json = null;
  $.ajax({
    'async': false,
    'global': false,
    'url': "/content.json",
    'dataType': "json",
    'success': function(data) {
      json = data;
    }
  });
  return json;
})();

Lo ejecuté con el depurador de Chrome y siempre me dice que el valor de la variable jsones null. El content.jsonarchivo reside en el mismo directorio que el archivo .js que lo llama.

¿Qué me perdí?


1
La URL de su archivo es lo /content.jsonque significa que el archivo está en el nivel raíz de su aplicación web. Cambie a content.json(sin barra) para señalarlo en el mismo directorio donde se encuentra su archivo de script. Solo en caso de que su archivo de script esté en el directorio de nivel raíz, funcionará.
Samich

el archivo reside en WebContent \ jit \ content.json .. Intenté 'url': "/WebContent/jit/content.json", pero aún así la variable es nula
PogoMips

Respuestas:


38

Si pegó su objeto content.jsondirectamente, es JSON inválido. Las claves y valores JSON deben estar entre comillas dobles ( "no ') a menos que el valor sea numérico, booleano nullo compuesto (matriz u objeto). JSON no puede contener funciones o undefinedvalores. A continuación se muestra su objeto como JSON válido.

{
  "id": "whatever",
  "name": "start",
  "children": [
    {
      "id": "0.9685",
      "name": " contents:queue"
    },
    {
      "id": "0.79281",
      "name": " contents:mqq_error"
    }
  ]
}

También tenías un extra }.


1
No puedo creer que lo haya solucionado ... ¿por qué funcionaría directamente incrustado en el archivo .js sin comillas dobles, pero no en el archivo .json? Eso no tiene ningún sentido ...
PogoMips

16
@ user1695165 - json y un objeto javascript son dos cosas diferentes, simplemente se ven iguales.
adeneo

2
@Kevin B "... a menos que el valor sea numérico [o booleano]".
Jacob Beauchamp

1
Solo un consejo: puede usar un validador json como jsonlint.com para verificar sus datos json antes de usarlo.
Marco Panichi

129

Mi solución, como se responde aquí , es usar:

    var json = require('./data.json'); //with path

El archivo se carga solo una vez, las solicitudes posteriores usan caché.

editar Para evitar el almacenamiento en caché, aquí está la función auxiliar de esta publicación de blog dada en los comentarios, usando el fsmódulo:

var readJson = (path, cb) => {
  fs.readFile(require.resolve(path), (err, data) => {
    if (err)
      cb(err)
    else
      cb(null, JSON.parse(data))
  })
}

48
Solo quería especificar que esta solución requiere una biblioteca adicional llamada RequireJS .
Luis Kabongo

4
¿Cómo evitar el almacenamiento en caché?
nono

2
No recomendado según Guilherme Oenning goenning.net/2016/04/14/stop-reading-json-files-with-require
Sangimed

2
TLDR; el almacenamiento en caché lo golpeó en las pruebas unitarias y, por lo tanto, le da una función auxiliar para evitar el almacenamiento en caché (ping @nono).
Ehvince

@Ehvince Oh, no me di cuenta de eso ya que no leí el artículo completo. Gracias :-)
Sangimed

50

Para ES6 / ES2015 puede importar directamente como:

// example.json
{
    "name": "testing"
}


// ES6/ES2015
// app.js
import * as data from './example.json';
const {name} = data;
console.log(name); // output 'testing'

Si usa Typecript, puede declarar el módulo json como:

// tying.d.ts
declare module "*.json" {
    const value: any;
    export default value;
}

Desde TypeScript 2.9+ puede agregar - resolveJsonModule compilerOptions intsconfig.json

{
  "compilerOptions": {
    "target": "es5",
     ...
    "resolveJsonModule": true,
     ...
  },
  ...
}

5
la importación no funciona en Chrome v72 - todavíaUncaught SyntaxError: Unexpected token *
1000Gbps

2
Cuando uso esto, parece que dataes un módulo pero data.defaultes el objeto
Dustin Michels

1
Estaba intentando ejecutar esto en la consola, pero sin éxito. Esto no funciona con el nodo v12.4.0, con babel-node 6.26.0. Siempre consigoSyntaxError: Unexpected token *
mario199

2
para ES6 / ES2015 puede importar directamente: parece que me sale un error de consola al hacerlo import * as data from './example.json'debido a un error de tipo mime.
Fallenreaper

si lo uso, import * as data from './example.json';entonces dataes solo un módulo, pero data.defaultes el objeto. Pero cuando uso, import data from './example.json';entonces dataes el objeto, que es más aplicable
Nel

4

Hay dos posibles problemas:

  1. AJAX es asincrónico, por jsonlo que no estará definido cuando regrese de la función externa. Cuando se haya cargado el archivo, la función de devolución de llamada se establecerájson en algún valor, pero en ese momento, a nadie le importa.

    Veo que intentaste arreglar esto con 'async': false. Para verificar si esto funciona, agregue esta línea al código y verifique la consola de su navegador:

    console.log(['json', json]);
  2. El camino puede estar equivocado. Utilice la misma ruta que utilizó para cargar su secuencia de comandos en el documento HTML. Entonces, si su secuencia de comandos es js/script.js, usejs/content.json

    Algunos navegadores pueden mostrarle a qué URL intentaron acceder y cómo fue (códigos de éxito / error, encabezados HTML, etc.). Consulte las herramientas de desarrollo de su navegador para ver qué sucede.


¿Quizás su versión de jquery aún no es compatible con esto? He mejorado la redacción.
Aaron Digulla

4

El incorporado módulo fs node.js lo hará de forma asíncrona o sincrónica según sus necesidades.

Puedes cargarlo usando var fs = require('fs');

Asincrónico

fs.readFile('./content.json', (err, data) => {
    if (err)
      console.log(err);
    else {
      var json = JSON.parse(data);
    //your code using json object
    }
})

Sincrónico

var json = JSON.parse(fs.readFileSync('./content.json').toString());

-1

Para el formato json dado como en el archivo ~ / my-app / src / db / abc.json:

  [
      {
        "name":"Ankit",
        "id":1
      },
      {
        "name":"Aditi",
        "id":2
      },
      {
        "name":"Avani",
        "id":3
      }
  ]

para importar a un archivo .js como ~ / my-app / src / app.js:

 const json = require("./db/abc.json");

 class Arena extends React.Component{
   render(){
     return(
       json.map((user)=>
        {
          return(
            <div>{user.name}</div>
          )
        }
       )
      }
    );
   }
 }

 export default Arena;

Salida:

Ankit Aditi Avani

Esta es una respuesta a una pregunta que no es la que se hace aquí.
Kevin B

@KevinB de acuerdo con mi explicación, importé el archivo .json al archivo .js. Esto me ayudó a cargar el archivo json en const json. Desde aquí, puedo usar el siguiente diccionario json para atributos de usuario y demás.
Ank_247shbm

Eso es genial, sin embargo, esta pregunta se trata de un usuario que intenta copiar un objeto literal en un archivo .json que luego carga con ajax, solo que su objeto literal estaba en un formato que no era válido para JSON. Si bien instalar React e importar esto con require funcionaría en algunos casos, realmente no ayuda en este caso.
Kevin B

Como nota: publicar comentarios que enlacen a esta respuesta en todas las demás respuestas puede considerarse autopromoción excesiva, e intentar editar las respuestas es vandalismo. Sus comentarios han sido eliminados y no vuelva a realizar modificaciones como esta.
Brad Larson

¡Gracias es un gran trabajo para mí!
Qui-Gon Jinn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.