将本地JSON文件加载到变量中

Pog*_*ips 87 javascript jquery json

我正在尝试将.json文件加载到javascript中的变量中,但我无法使其工作.这可能只是一个小错误,但我找不到它.

当我使用这样的静态数据时,一切正常:

var json = {
            id: "whatever", 
            name: "start",
            children: [{
                         "id":"0.9685","name":" contents:queue"},{
                         "id":"0.79281","name":" contents:mqq_error"}}]
        }
Run Code Online (Sandbox Code Playgroud)

所以我将{}中的所有内容放在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;
    })();
Run Code Online (Sandbox Code Playgroud)

我用chrome调试器运行它,它总是告诉我变量json的值为null.content.json与调用它的.js文件驻留在同一目录中.

我错过了什么?

Ehv*_*nce 107

在这里回答的解决方案是使用:

    var json = require('./data.json'); //with path
Run Code Online (Sandbox Code Playgroud)

该文件只加载一次,进一步请求使用缓存.

编辑为了避免缓存,这里是注释中给出的博客文章中的帮助函数,使用fs模块:

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

  • 只是想指定此解决方案需要另一个名为[RequireJS](http://requirejs.org)的库. (39认同)
  • 请注意,它在nodejs中开箱即用. (20认同)
  • 如何避免缓存? (4认同)
  • 根据Guilherme Oenning不推荐使用https://goenning.net/2016/04/14/stop-reading-json-files-with-require/ (2认同)
  • TLDR; 缓存在单元测试中击中了他,因此他提供了一个辅助函数来避免缓存(ping @nono). (2认同)

Lit*_*oys 36

对于ES6/ES2015,您可以直接导入,如:

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


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

如果你使用typescript,你可以声明json模块:

// tying.d.ts
declare module "*.json" {
    const value: any;
    export default value;
}
Run Code Online (Sandbox Code Playgroud)

  • 导入在Chrome v72中不起作用-仍然是“未捕获的SyntaxError:意外令牌*” (2认同)
  • 当我使用它时,似乎`data`是一个模块,但是`data.default`是对象 (2认同)
  • *对于ES6 / ES2015 *,您可以直接导入:似乎由于mime类型错误,在执行import *作为'./example.json'中的数据时出现控制台错误。 (2认同)
  • 如果我使用 `import * as data from './example.json';` 那么 `data` 只是模块,但 `data.default` 是对象。但是当我使用“import data from './example.json';”时,“data”就是对象,这更适用 (2认同)

use*_*654 33

如果直接将对象粘贴到content.json中,则它是无效的json.除非值为数字,否则json键AND值必须用双引号(不是单引号)包装.以下将是您的对象作为有效的json.

{
  "id": "whatever", 
  "name": "start",
  "children": [{
    "id":"0.9685","name":" contents:queue"},{
    "id":"0.79281","name":" contents:mqq_error"}]
}
Run Code Online (Sandbox Code Playgroud)

(你还有一个额外的})

  • @ user1695165 - json和一个javascript对象是两个不同的东西,它们看起来一模一样. (14认同)
  • 我不敢相信它已经修复了..为什么它可以直接嵌入到 .js 文件中而无需双引号,但不能嵌入到 .json 文件中?这没有任何意义... (2认同)
  • @Kevin B"......除非值是数字[或布尔]." (2认同)
  • 提示:您可以使用像 https://jsonlint.com/ 这样的 json 验证器,以便在使用前检查您的 json 数据。 (2认同)

laf*_*ber 12

没有 require 或 fs 的解决方案:

var json = []
fetch('./content.json').then(response => json = response.json())
Run Code Online (Sandbox Code Playgroud)


小智 7

内置的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
    }
})
Run Code Online (Sandbox Code Playgroud)

同步

var json = JSON.parse(fs.readFileSync('./content.json').toString());
Run Code Online (Sandbox Code Playgroud)


Ani*_*mar 7

来自未来的答案。
2022 年,我们有导入断言 api,用于在 js 文件中导入 json 文件。

import myjson from "./myjson.json" assert { type: "json" };
console.log(myjson);
Run Code Online (Sandbox Code Playgroud)

浏览器支持:到 2022 年 9 月,仅支持基于 chromium 的浏览器和 safari。

阅读更多内容:v8 导入断言帖子