Laden Sie die lokale JSON-Datei in eine Variable

111

Ich versuche, eine .json-Datei in eine Variable in Javascript zu laden, aber ich kann sie nicht zum Laufen bringen. Es ist wahrscheinlich nur ein kleiner Fehler, aber ich kann ihn nicht finden.

Alles funktioniert einwandfrei, wenn ich statische Daten wie folgt verwende:

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

Ich habe alles, was in der Datei enthalten ist, {}in eine content.jsonDatei eingefügt und versucht, dies in eine lokale JavaScript-Variable zu laden, wie hier erläutert: Laden Sie json in eine Variable .

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

Ich habe es mit dem Chrome-Debugger ausgeführt und es sagt mir immer, dass der Wert der Variablen jsonist null. Die content.jsonDatei befindet sich im selben Verzeichnis wie die JS-Datei, die sie aufruft.

Was habe ich verpasst?

PogoMips
quelle
1
Ihre Datei-URL /content.jsonbedeutet, dass sich die Datei auf der Stammebene Ihrer Webanwendung befindet. Wechseln Sie zu content.json(ohne Schrägstrich), um auf dasselbe Verzeichnis zu verweisen, in dem sich Ihre Skriptdatei befindet. Nur für den Fall, dass sich Ihre Skriptdatei im Stammverzeichnis befindet, funktioniert sie.
Samich
Die Datei befindet sich in WebContent \ jit \ content.json. Ich habe 'url' versucht: "/WebContent/jit/content.json", aber die Variable ist immer noch null
PogoMips

Antworten:

38

Wenn Sie Ihr Objekt content.jsondirekt eingefügt haben , ist JSON ungültig. JSON-Schlüssel und -Werte müssen in doppelte Anführungszeichen gesetzt werden ( "nicht '), es sei denn, der Wert ist numerisch, boolesch nulloder zusammengesetzt (Array oder Objekt). JSON darf keine Funktionen oder undefinedWerte enthalten. Unten ist Ihr Objekt als gültiger JSON.

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

Sie hatten auch ein Extra }.

Kevin B.
quelle
1
Ich kann nicht glauben, dass das Problem behoben wurde. Warum sollte es ohne doppelte Anführungszeichen direkt in die JS-Datei eingebettet funktionieren, aber nicht in die JSON-Datei? Das macht keinen Sinn ...
PogoMips
16
@ user1695165 - json und ein Javascript-Objekt sind zwei verschiedene Dinge, sie sehen einfach gleich aus.
Adeneo
2
@ Kevin B "... es sei denn, der Wert ist numerisch [oder boolesch]."
Jacob Beauchamp
1
Nur ein Tipp: Sie können einen JSON- Validator wie jsonlint.com verwenden, um Ihre JSON-Daten vor der Verwendung zu überprüfen.
Marco Panichi
129

Meine hier beantwortete Lösung lautet:

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

Die Datei wird nur einmal geladen, weitere Anfragen verwenden den Cache.

Bearbeiten Um Caching zu vermeiden, finden Sie hier die Hilfsfunktion dieses Blogposts in den Kommentaren mithilfe des fsModuls:

var readJson = (path, cb) => {
  fs.readFile(require.resolve(path), (err, data) => {
    if (err)
      cb(err)
    else
      cb(null, JSON.parse(data))
  })
}
Ehvince
quelle
47
Ich wollte nur angeben, dass für diese Lösung eine zusätzliche Bibliothek mit dem Namen RequireJS erforderlich ist .
Luis Kabongo
4
Wie vermeide ich Caching?
Nono
2
Nicht empfohlen nach Guilherme Oenning goenning.net/2016/04/14/stop-reading-json-files-with-require
Sangimed
2
TLDR; Das Caching traf ihn in Unit-Tests und so gibt er eine Hilfsfunktion, um das Caching zu vermeiden (ping @nono).
Ehvince
@Ehvince Oh, das habe ich nicht bemerkt, da ich nicht den ganzen Artikel gelesen habe. Vielen Dank :-)
Sangimed
50

Für ES6 / ES2015 können Sie direkt importieren wie:

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


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

Wenn Sie Typescript verwenden, können Sie das JSON-Modul wie folgt deklarieren:

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

Seit Typescript 2.9+ können Sie hinzufügen - auflösenJsonModule compilerOptions intsconfig.json

{
  "compilerOptions": {
    "target": "es5",
     ...
    "resolveJsonModule": true,
     ...
  },
  ...
}
Kleine Roys
quelle
5
Import funktioniert nicht in Chrome v72 - immer nochUncaught SyntaxError: Unexpected token *
1000
2
Wenn ich das benutze, scheint dataes ein Modul zu sein, aber es data.defaultist das Objekt
Dustin Michels
1
Ich habe versucht, dies in der Konsole auszuführen, aber ohne Erfolg. Dies funktioniert nicht mit Knoten v12.4.0, mit Babel-Knoten 6.26.0. Ich bekomme immerSyntaxError: Unexpected token *
mario199
2
Für ES6 / ES2015 können Sie direkt importieren: Es scheint, dass ich import * as data from './example.json'aufgrund eines MIME-Typ-Fehlers einen Konsolenfehler erhalte .
Fallenreaper
wenn ich benutze import * as data from './example.json';dann dataist nur modul, aber data.defaultist das objekt. Aber wenn ich import data from './example.json';dann benutze, dataist das Objekt, das anwendbarer ist
Nel
4

Es gibt zwei mögliche Probleme:

  1. AJAX ist asynchron und wird daher jsonnicht definiert, wenn Sie von der äußeren Funktion zurückkehren. Wenn die Datei geladen wurde, wird die Rückruffunktion jsonauf einen bestimmten Wert gesetzt, aber zu diesem Zeitpunkt kümmert sich niemand mehr darum.

    Ich sehe, dass Sie versucht haben, dies zu beheben 'async': false. Um zu überprüfen, ob dies funktioniert, fügen Sie diese Zeile zum Code hinzu und überprüfen Sie die Konsole Ihres Browsers:

    console.log(['json', json]);
  2. Der Pfad könnte falsch sein. Verwenden Sie denselben Pfad, den Sie zum Laden Ihres Skripts in das HTML-Dokument verwendet haben. Also, wenn Ihr Skript ist js/script.js, verwenden Siejs/content.json

    Einige Browser können Ihnen zeigen, auf welche URLs sie zugreifen wollten und wie dies ging (Erfolgs- / Fehlercodes, HTML-Header usw.). Überprüfen Sie die Entwicklungstools Ihres Browsers, um festzustellen, was passiert.

Aaron Digulla
quelle
Vielleicht unterstützt seine Version von jquery dies noch nicht? Ich habe den Wortlaut verbessert.
Aaron Digulla
4

Das eingebaute node.js-Modul fs dies je nach Bedarf entweder asynchron oder synchron.

Sie können es mit laden var fs = require('fs');

Asynchron

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

Synchron

var json = JSON.parse(fs.readFileSync('./content.json').toString());
Arnaud M.
quelle
-1

Für das angegebene JSON-Format wie in der Datei ~ / my-app / src / db / abc.json:

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

Um in eine .js-Datei wie ~ / my-app / src / app.js zu importieren:

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

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

 export default Arena;

Ausgabe:

Ankit Aditi Avani
Ank_247shbm
quelle
Dies ist eine Antwort auf eine Frage, die hier nicht gestellt wird.
Kevin B
@ KevinB gemäß meiner Erklärung habe ich die .json-Datei in die .js-Datei importiert. Dies half mir, json-file in const json zu laden. Von hier aus kann ich das folgende JSON-Wörterbuch für Benutzerattribute und so weiter verwenden.
Ank_247shbm
Das ist großartig, aber bei dieser Frage geht es um einen Benutzer, der versucht, ein Objektliteral in eine JSON-Datei zu kopieren, die er dann mit Ajax lädt. Nur sein Objektliteral hatte ein Format, das für JSON nicht gültig war. Während die Installation von React und das Importieren mit Require in einigen Fällen sicherlich funktionieren würde, hilft dies in diesem Fall nicht wirklich .
Kevin B
Hinweis: Das Posten von Kommentaren, die mit dieser Antwort auf alle anderen Antworten verknüpft sind, kann als übermäßige Eigenwerbung angesehen werden, und der Versuch, Antworten zu bearbeiten, ist Vandalismus. Ihre Kommentare wurden entfernt und bitte nehmen Sie diese Änderungen nicht noch einmal vor.
Brad Larson
Danke, die Arbeit ist großartig für mich!
Qui-Gon Jinn