Carica il file JSON locale nella variabile


113

Sto cercando di caricare un file .json in una variabile in javascript, ma non riesco a farlo funzionare. Probabilmente è solo un errore minore ma non riesco a trovarlo.

Tutto funziona perfettamente quando uso dati statici come questo:

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

Ho messo tutto ciò che si trova in {}un content.jsonfile e ho provato a caricarlo in una variabile JavaScript locale come spiegato qui: carica json in variabile .

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

L'ho eseguito con il debugger di Chrome e mi dice sempre che il valore della variabile jsonè null. Il content.jsonfile risiede nella stessa directory del file .js che lo chiama.

Cosa mi sono perso?


1
L'URL del tuo file è il /content.jsonche significa che il file è a livello di root della tua app web. Cambia in content.json(senza barra) per puntarlo nella stessa directory in cui è posizionato il tuo file di script. Solo nel caso in cui se il tuo file di script si trova nella directory a livello di root, funzionerà.
Samich

il file risiede in WebContent \ jit \ content.json .. Ho provato "url": "/WebContent/jit/content.json", ma la variabile è ancora nulla
PogoMips

Risposte:


38

Se hai incollato il tuo oggetto content.jsondirettamente, non è un JSON non valido. Le chiavi e i valori JSON devono essere racchiusi tra virgolette doppie ( "non ') a meno che il valore non sia numerico, booleano nullo composto (matrice o oggetto). JSON non può contenere funzioni o undefinedvalori. Di seguito è riportato il tuo oggetto come JSON valido.

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

Hai avuto anche un extra }.


1
Non posso credere che l'abbia risolto .. perché dovrebbe funzionare direttamente incorporato nel file .js senza virgolette doppie, ma non nel file .json? Non ha alcun senso ...
PogoMips

16
@ user1695165 - json e un oggetto javascript sono due cose diverse, hanno lo stesso aspetto.
adeneo

2
@Kevin B "... a meno che il valore non sia numerico [o booleano]."
Jacob Beauchamp

1
Solo un consiglio: puoi usare un validatore json come jsonlint.com per controllare i tuoi dati json prima di usarlo.
Marco Panichi

129

La mia soluzione, come risposto qui , è usare:

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

Il file viene caricato una sola volta, ulteriori richieste utilizzano la cache.

modifica Per evitare la memorizzazione nella cache, ecco la funzione di supporto da questo post del blog fornita nei commenti, utilizzando il fsmodulo:

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

48
Volevo solo specificare che questa soluzione richiede una libreria aggiuntiva denominata RequireJS .
Luis Kabongo

4
Come evitare la memorizzazione nella cache?
nono

2
Non raccomandato secondo Guilherme Oenning goenning.net/2016/04/14/stop-reading-json-files-with-require
Sangimed

2
TLDR; il caching lo ha colpito nei test unitari e quindi fornisce una funzione di aiuto per evitare il caching (ping @nono).
Ehvince

@ Ehvince Oh non me ne sono accorto poiché non ho letto l'intero articolo. Grazie :-)
Sangimed

50

Per ES6 / ES2015 puoi importare direttamente come:

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


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

Se usi Typescript, puoi dichiarare il modulo json come:

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

A partire da Typescript 2.9+ puoi aggiungere - resolutionJsonModule compilerOptions intsconfig.json

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

5
l'importazione non funziona in Chrome v72 - ancoraUncaught SyntaxError: Unexpected token *
1000 Gbps

2
Quando lo uso, sembra che datasia un modulo ma data.defaultè l'oggetto
Dustin Michels

1
Stavo cercando di eseguirlo in console, ma senza successo. Questo non funziona con il nodo v12.4.0, con babel-node 6.26.0. Ottengo sempreSyntaxError: Unexpected token *
mario199

2
per ES6 / ES2015 è possibile importare direttamente: Sembra che riceva un errore della console durante l'operazione a import * as data from './example.json'causa di un errore di tipo MIME.
Fallenreaper

se uso import * as data from './example.json';allora dataè solo modulo, ma data.defaultè l'oggetto. Ma quando lo uso import data from './example.json';poi dataè l'oggetto, che è più applicabile
Nel

4

Ci sono due possibili problemi:

  1. AJAX è asincrono, quindi jsonnon sarà definito quando torni dalla funzione esterna. Quando il file è stato caricato, la funzione di callback verrà impostata jsonsu un valore ma in quel momento a nessuno importa più.

    Vedo che hai provato a risolvere questo problema con 'async': false. Per verificare se funziona, aggiungi questa riga al codice e controlla la console del tuo browser:

    console.log(['json', json]);
  2. Il percorso potrebbe essere sbagliato. Utilizza lo stesso percorso che hai utilizzato per caricare lo script nel documento HTML. Quindi, se il tuo script è js/script.js, usajs/content.json

    Alcuni browser possono mostrarti a quali URL hanno tentato di accedere e come sono andati (codici di successo / errore, intestazioni HTML, ecc.). Controlla gli strumenti di sviluppo del tuo browser per vedere cosa succede.


Forse la sua versione di jquery non lo supporta ancora? Ho migliorato la formulazione.
Aaron Digulla

4

Il modulo integrato node.js fs lo farà in modo asincrono o sincrono a seconda delle tue esigenze.

Puoi caricarlo usando var fs = require('fs');

asincrono

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

Sincrono

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

-1

Per il formato json dato come nel file ~ / my-app / src / db / abc.json:

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

per importare in file .js come ~ / 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;

Produzione:

Ankit Aditi Avani

Questa è una risposta a una domanda che non è quella posta qui.
Kevin B

@KevinB secondo la mia spiegazione, ho importato il file .json nel file .js. Questo mi ha aiutato a caricare il file json in const json. Da qui, sono in grado di utilizzare il seguente dizionario json per gli attributi utente e così via.
Ank_247shbm

È fantastico, tuttavia, questa domanda riguarda un utente che cerca di copiare un oggetto letterale in un file .json che poi carica con ajax, solo, il loro oggetto letterale era in un formato che non era valido per JSON. Mentre l'installazione di react e l'importazione di questo con require funzionerebbe sicuramente in alcuni casi, non aiuta davvero questo caso.
Kevin B

Come nota: pubblicare commenti collegati a questa risposta su tutte le altre risposte può essere considerato un'autopromozione eccessiva e il tentativo di modificare le risposte è vandalismo. I tuoi commenti sono stati rimossi e ti preghiamo di non apportare più modifiche come questa.
Brad Larson

Grazie è un ottimo lavoro per me!
Qui-Gon Jinn
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.