2013-01-23 13 views
53

Sto provando a 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.Carica il file JSON locale nella variabile

Tutto funziona bene quando uso i dati statici in questo modo:

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

così ho messo tutto quello che c'è in {} in un file content.json e ha cercato di caricare che in una javascript variabile locale come spiegato qui : 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; 
    })(); 

ho fatto funzionare con il debugger cromo e mi dice sempre che il valore della jSON variabile è nulla. Content.json si trova nella stessa directory del file .js che lo chiama.

Cosa mi sono perso?

+1

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

+0

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

risposta

23

Se l'oggetto è stato incollato direttamente in content.json, non è valido. chiavi json E valori devono essere racchiusi tra virgolette (non singole!) a meno che il valore non sia numerico. Di seguito sarebbe il tuo oggetto come json valido.

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

(voi hanno avuto anche un extra })

+0

Non posso credere che sia stato risolto .. perché funzionerebbe direttamente incorporato nel file .js senza virgolette, ma non nel file .json? Questo non ha alcun senso... – PogoMips

+9

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

+1

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

4

ci sono due possibili problemi:

  1. AJAX è asincrona, quindi sarà indefinito json quando si torna dalla funzione esterna. Quando il file è stato caricato, la funzione di callback imposterà json ad un certo valore ma a quel tempo, a nessuno importa più.

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

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

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

+0

Forse la sua versione di jquery non supporta questo, eppure ? Ho migliorato la formulazione. –

69

La mia soluzione, come risposta here, è quello di utilizzare:

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

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

+24

Volevo solo specificare che questa soluzione richiede una libreria aggiuntiva denominata [RequireJS] (http://requirejs.org). –

+16

nota che funziona fuori dalla scatola in nodejs. – Ehvince

+3

Come evitare la memorizzazione nella cache? – nono

Problemi correlati