加载本地 JSON 文件

IT技术 javascript jquery json firebug local-files
2021-02-05 10:13:29

我正在尝试加载本地 JSON 文件,但它不起作用。这是我的 JavaScript 代码(使用 jQuery):

var json = $.getJSON("test.json");
var data = eval("(" +json.responseText + ")");
document.write(data["a"]);

test.json 文件:

{"a" : "b", "c" : "d"}

什么也没有显示,Firebug 告诉我那data是未定义的。在 Firebug 中,我可以看到json.responseText并且它很好且有效,但是当我复制该行时很奇怪:

 var data = eval("(" +json.responseText + ")");

在 Firebug 的控制台中,它可以工作并且我可以访问数据。

有没有人有办法解决吗?

6个回答

$.getJSON 是异步的,所以你应该这样做:

$.getJSON("test.json", function(json) {
    console.log(json); // this will show the info it in firebug console
});
完全正确。Chromes 的安全性比 Firefox 或其他的要严格得多。除了一两件事之外,使用 xhr、Josn、Xml 等加载任何东西几乎都在 Chrome 中被锁定。
2021-03-11 10:13:29
我试过这个,但没有运气。控制台中也没有错误:(
2021-03-18 10:13:29
不,它不能是文件,但必须由网络服务器提供服务。
2021-03-31 10:13:29
我建议使用myjson.com上传您的本地文件并从 chrome 浏览器访问它。
2021-04-03 10:13:29
你真的允许访问本地文件吗?
2021-04-05 10:13:29

我有同样的需求(测试我的 angularjs 应用程序),我发现的唯一方法是使用 require.js:

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

注意:文件被加载一次,进一步的调用将使用缓存。

有关使用 nodejs 读取文件的更多信息:http ://docs.nodejitsu.com/articles/file-system/how-to-read-files-in-nodejs

require.js:http: //requirejs.org/

如果你是开玩笑地这样做,那么记得这样做jest.dontMock('./data.json');,否则结果是空的。可能对那里的人有用:)
2021-03-12 10:13:29
require 不适用于浏览器,因为它是 node.js module。如果 OP 想在浏览器中加载它,应该使用 fetch 是正确的解决方案。
2021-03-21 10:13:29
是的,require 是针对 node 的,但 requireJS 也可以在浏览器中使用:“RequireJS 是一个 JavaScript 文件和module加载器。它针对浏览器中的使用进行了优化,但它可以在其他 JavaScript 环境中使用,如 Rhino 和 Node。 ”
2021-03-21 10:13:29
这段代码的上下文是什么?你怎么办json
2021-04-02 10:13:29
请提供完整示例:我收到错误: has not been loaded yet for context: _. Use require([])
2021-04-02 10:13:29

以更现代的方式,您现在可以使用Fetch API

fetch("test.json")
  .then(response => response.json())
  .then(json => console.log(json));

所有现代浏览器都支持 Fetch API。(Internet Explorer 没有,但 Edge 有!)

来源:

@LarsH 显然是的,我今天早上试过了,fetch api 无法读取带有 file:// 方案的本地 json 文件。这种方法看起来很干净,但你不能将它用于本地文件
2021-03-22 10:13:29
您无法使用 fetch API 访问本地文件
2021-03-27 10:13:29
fetch 仅支持 HTTP(S) 协议!
2021-03-31 10:13:29
@keysl 好的,我想出于安全原因可能必须这样。(你是对的,我的意思是“禁止通过该file://方案访问文件。)但这是一种很好的干净方法。由于这个答案,我已经开始使用它。
2021-04-02 10:13:29
使用 Fetch API 时,是否仍然禁止访问本地文件,除非您禁用安全设置?
2021-04-05 10:13:29

如果您想让用户选择本地 json 文件(文件系统上的任何位置),则以下解决方案有效。

它使用 FileReader 和 JSON.parser(没有 jquery)。

<html>
<body>

<form id="jsonFile" name="jsonFile" enctype="multipart/form-data" method="post">

  <fieldset>
    <h2>Json File</h2>
     <input type='file' id='fileinput'>
     <input type='button' id='btnLoad' value='Load' onclick='loadFile();'>
  </fieldset>
</form>


<script type="text/javascript">

  function loadFile() {
    var input, file, fr;

    if (typeof window.FileReader !== 'function') {
      alert("The file API isn't supported on this browser yet.");
      return;
    }

    input = document.getElementById('fileinput');
    if (!input) {
      alert("Um, couldn't find the fileinput element.");
    }
    else if (!input.files) {
      alert("This browser doesn't seem to support the `files` property of file inputs.");
    }
    else if (!input.files[0]) {
      alert("Please select a file before clicking 'Load'");
    }
    else {
      file = input.files[0];
      fr = new FileReader();
      fr.onload = receivedText;
      fr.readAsText(file);
    }

    function receivedText(e) {
      let lines = e.target.result;
      var newArr = JSON.parse(lines); 
    }
  }
</script>

</body>
</html>

这是关于 FileReader 的一个很好的介绍:http ://www.html5rocks.com/en/tutorials/file/dndfiles/

FileReader API 在 IE 8 或 9 中不受支持,但所有其他浏览器都可以:caniuse.com/#search=filereader
2021-03-21 10:13:29
它在 Chrome 中完美运行,您将在其中看到您的数据 newArr
2021-03-27 10:13:29
这个答案很好,有点不同,因为它没有使用 jQuery。
2021-03-30 10:13:29

如果您正在寻找快速而肮脏的东西,只需将数据加载到 HTML 文档的头部即可。

数据.js

var DATA = {"a" : "b", "c" : "d"};

索引.html

<html>
<head>
   <script src="data.js" ></script>
   <script src="main.js" ></script>
</head>
...
</html>

主文件

(function(){
   console.log(DATA); // {"a" : "b", "c" : "d"}
})();

我应该提到你的堆大小(在 Chrome 中)大约是 4GB,所以如果你的数据大于这个,你应该找到另一种方法。如果您想检查其他浏览器,请尝试以下操作:

window.performance.memory.jsHeapSizeLimit / 1024 / 1024 / 1024 + " GBs"
// "4.046875 GBs"
你说 AMD 可以工作是对的,但我不认为 AMD 是正确的解决方案。最简单的是使用 $.getJSON。谢谢
2021-03-20 10:13:29
我发现这对我来说是最简单的解决方案。JSON 文件看起来几乎相同,所以没有额外的混乱(文件最顶部只有一个“var xyz =”)。没有人希望他们的代码中有一个大数据文件。
2021-03-20 10:13:29
这在很多层面上都是错误的,我不明白它怎么有这么多票,这里解释了更多如果有人想看codepen.io/KryptoniteDove/post/... “许多例子将证明你可以使用”
2021-03-31 10:13:29
@PatrickBrowne 是的,getJSON 是一个很好的解决方案,但我认为在很多情况下您会遇到跨域问题(例如从 S3 加载数据)。
2021-04-04 10:13:29
老实说,这是一个很好的解决方案,如果您只有一些预装数据并且想要提供静态页面
2021-04-06 10:13:29