Загрузите локальный файл JSON в переменную

Я пытаюсь загрузить файл .json в переменную в javascript, но я не могу заставить ее работать. Вероятно, это небольшая ошибка, но я не могу ее найти.

Все работает отлично, когда я использую статические данные следующим образом:

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

Поэтому я поместил все, что в {} в файле content.json, и попытался загрузить его в локальную переменную javascript, как описано здесь: загрузить json в переменную

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

Я запустил его с хром-отладчиком, и он всегда говорит мне, что значение переменной json равно null. Content.json находится в том же каталоге, что и файл .js, который его вызывает.

Что я пропустил?

Ответ 1

Если вы вставили свой объект непосредственно в content.json, это недопустимый json. JSON-ключи И значения должны быть заключены в двойные кавычки (не одиночные!), если только это значение не является числовым или логическим. Ниже будет ваш объект как действительный JSON.

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

(у вас также был дополнительный })

Ответ 2

Мое решение, как здесь ответили, заключается в использовании:

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

Файл загружается только один раз, дальнейшие запросы используют кеш.

edit Чтобы избежать кеширования, вот вспомогательная функция из этого поста, приведенная в комментариях с использованием модуля fs:

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

Ответ 3

Для ES6/ES2015 вы можете импортировать напрямую, например:

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


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

Если вы используете Typescript, вы можете объявить модуль json следующим образом:

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

Начиная с Typescript 2. 9+ вы можете добавить - resolJsonModule compilerOptions в tsconfig.json

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

Ответ 4

Возможны две проблемы:

  • AJAX является асинхронным, поэтому json будет undefined, когда вы вернетесь из внешней функции. Когда файл был загружен, функция обратного вызова установит json на некоторое значение, но в то время больше никто не заботится.

    Я вижу, что вы пытались исправить это с помощью 'async': false. Чтобы проверить, работает ли это, добавьте эту строку в код и проверьте консоль своего браузера:

    console.log(['json', json]);
    
  • Путь может быть неправильным. Используйте тот же путь, который использовался для загрузки script в документе HTML. Поэтому, если ваш script равен js/script.js, используйте js/content.json

    Некоторые браузеры могут показать вам, к каким URL-адресам они пытались получить доступ и как это происходило (коды успеха/ошибки, заголовки HTML и т.д.). Проверьте свои инструменты разработки браузера, чтобы узнать, что произойдет.

Ответ 5

Встроенный модуль node.js fs сделает это либо асинхронно, либо синхронно, в зависимости от ваших потребностей.

Вы можете загрузить его, используя var fs = require('fs');

Асинхронный

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

синхронный

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

Ответ 6

Импортируйте файл JSON с ES6:

import myJson from '/path/to/filename.json'
myJsonString = JSON.stringify(myJson)

Если файл находится в том же каталоге, вы можете использовать

import myJson from './filename.json

До ES6

var json = require('./filename.json');