139

我正在尝试将 .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;
})();

我用 Chrome 调试器运行它,它总是告诉我变量的值jsonnull. 该content.json文件与调用它的 .js 文件位于同一目录中。

我错过了什么?

4

8 回答 8

143

正如这里所回答的,我的解决方案是使用:

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

该文件仅加载一次,进一步的请求使用缓存。

编辑为了避免缓存,这是评论中给出的这篇博文的帮助函数,使用fs模块:

var readJson = (path, cb) => {
  fs.readFile(require.resolve(path), (err, data) => {
    if (err)
      cb(err)
    else
      cb(null, JSON.parse(data))
  })
}
于 2013-08-05T14:24:32.427 回答
72

对于 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+ 开始,您可以在中添加--resolveJsonModule compilerOptionstsconfig.json

{
  "compilerOptions": {
    "target": "es5",
     ...
    "resolveJsonModule": true,
     ...
  },
  ...
}
于 2018-05-26T06:38:23.047 回答
45

如果您将对象content.json直接粘贴到其中,则它是无效的 JSON。JSON 键值必须用双引号 ( "not ') 括起来,除非值是数字、布尔值null或复合(数组或对象)。JSON 不能包含函数或undefined值。以下是您作为有效 JSON 的对象。

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

你还有一个额外的}.

于 2013-01-23T16:43:39.870 回答
7

没有 require 或 fs 的解决方案:

var json = []
fetch('./content.json').then(response => json = response.json())
于 2021-01-27T16:04:09.203 回答
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());
于 2018-11-27T14:49:11.857 回答
4

有两个可能的问题:

  1. AJAX 是异步的,因此json当您从外部函数返回时将是未定义的。当文件被加载后,回调函数会设置json为某个值,但那时,没有人关心了。

    我看到你试图用'async': false. 要检查这是否有效,请将此行添加到代码中并检查浏览器的控制台:

    console.log(['json', json]);
    
  2. 路径可能是错误的。使用与在 HTML 文档中加载脚本相同的路径。因此,如果您的脚本是js/script.js,请使用js/content.json

    一些浏览器可以向您显示他们尝试访问的 URL 以及访问方式(成功/错误代码、HTML 标头等)。检查浏览器的开发工具,看看会发生什么。

于 2013-01-23T16:38:39.550 回答
3

对于文件 ~/my-app/src/db/abc.json 中给定的 json 格式:

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

为了导入到 .js 文件,如 ~/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;

输出:

Ankit Aditi Avani
于 2020-06-10T19:47:44.000 回答
1

要将特定值从 output.json(包含问题共享的 json)文件导出到变量,请说 VAR :

export VAR=$(jq -r '.children.id' output.json)
于 2021-05-19T10:56:25.303 回答