如何在JavaScript中读取外部本地JSON文件?

use*_*315 210 javascript json

我在本地系统中保存了一个JSON文件并创建了一个JavaScript文件,以便读取JSON文件并打印出数据.这是JSON文件:

{"resource":"A","literals":["B","C","D"]}
Run Code Online (Sandbox Code Playgroud)

假设这是JSON文件的路径:/Users/Documents/workspace/test.json.

任何人都可以帮我写一段简单的代码来阅读JSON文件并在JavaScript中打印数据吗?

小智 167

要使用javascript读取外部Local JSON文件(data.json),首先要创建data.json文件:

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
Run Code Online (Sandbox Code Playgroud)
  1. 提及脚本源中json文件的路径以及javascript文件.

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从json文件中获取Object

    var mydata = JSON.parse(data);
    alert(mydata[0].name);
    alert(mydata[0].age);
    alert(mydata[1].name);
    alert(mydata[1].age);
    
    Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此参考.

  • 这不是一个正确的答案.答案中的示例是不加载json文件.它实际上只是加载另一个javascript文件,它存储一些硬编码的json作为名为`data`的变量.如果你从`data.json`中删除json周围的字符串引号,你甚至不需要使用`JSON.parse`.问题是如何加载JSON文件而不是如何将JSON硬编码到另一个javascript文件然后加载它. (219认同)
  • 如果您可以修改文件,或者文件没有​​正确的JSON作为其内容,则此方法有效.例如,上面`data.json`的示例内容未通过验证:http://jsonlint.com/因为它确实是JavaScript.删除包装单引号会将其转换为纯JavaScript. (7认同)
  • **注意:**某些旧版浏览器不支持**`JSON.parse`(看着你的IE).请参阅[MDN的浏览器兼容性表中的"window.JSON"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON#Browser_compatibility). (3认同)
  • `&lt;script type="text/javascript" src="data.json"&gt;&lt;/script&gt;` 实际上应该是 `&lt;script type="text/javascript" src="data.js"&gt;&lt;/script&gt;` 。请注意,这是一个 JavaScript 文件。 (3认同)
  • 虽然这不是一个正确的答案,但它对我很有帮助,因为它让我意识到“doh,我可以使用 js 而不是 json”。我可以控制数据,因此我可以轻松地将其更改为代码。 (3认同)

Sta*_*ano 113

.json从硬盘加载文件是一个异步操作,因此需要指定在加载文件后执行的回调函数.

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}

//usage:
readTextFile("/Users/Documents/workspace/test.json", function(text){
    var data = JSON.parse(text);
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

此函数也可用于通过覆盖mime类型参数来加载一个.html或多个.txt文件"text/html","text/plain"等等.

  • 在尝试使用当前的Chrome时,我得到"仅支持协议方案的跨源请求:http,数据,chrome,chrome-extension,https." - 所以没有文件协议,这里隐含着@GreySage (10认同)
  • 这是一个非常糟糕的做法!在Google Chrome中,您无法对本地资源进行XmlHttpRequest. (9认同)
  • @mhaseeb如果资源与请求系统具有相同的域/协议(由于它是本地的),您可以(即使是现在,将来).查找CORS. (8认同)
  • XMLHttpRequest.status 返回一个数值。这只有效,因为 javascript 在后台做一些事情以使您的代码不会死。应如下所示:rawFile.status === 200 (2认同)

Chr*_*ord 79

无法对本地资源进行AJAX调用,因为请求是使用HTTP进行的.

解决方法是运行本地Web服务器,提供文件并对localhost进行AJAX调用.

在帮助您编写代码以读取JSON方面,您应该阅读以下文档jQuery.getJSON():

http://api.jquery.com/jQuery.getJSON/

  • 这仅适用于AJAX:在Chrome下并使用HTML5的File API我已经做到了.这个问题没有询问AJAX. (19认同)
  • 如果安装了python,可以在浏览器(Windows或Mac)中使用命令行`python -m SimpleHTTPServer 8888`并打开`http:// localhost:8888 /`.`8888`是端口,可以更改. (9认同)
  • 要更新@geotheory 的评论,使用 Python 3 命令是`python -m http.server 8888` (4认同)
  • 您能否指导我在这种情况下如何运行本地服务器?为了使本地服务器运行,我需要做什么? (2认同)
  • 你在用什么环境?视窗?Linux呢? (2认同)
  • 另外,Python 方法的 PHP 替代方案:`php -S 127.0.0.1:8888` (2认同)

Sye*_*ebe 26

  1. 首先,创建一个json文件.在这个例子中,我的文件是words.json

[{"name":"ay","id":"533"},
{"name":"kiy","id":"33"},
{"name":"iy","id":"33"},
{"name":"iy","id":"3"},
{"name":"kiy","id":"35"},
{"name":"kiy","id":"34"}]
Run Code Online (Sandbox Code Playgroud)

  1. 这是我的代码,即node.js.注意'utf8'参数readFileSync:这使得它不返回Buffer(虽然JSON.parse可以处理它),而是一个字符串.我正在创建一个服务器来查看结果...

var fs=require('fs');
var data=fs.readFileSync('words.json', 'utf8');
var words=JSON.parse(data);
var bodyparser=require('body-parser');
console.log(words);
var express=require('express');

var app=express();

var server=app.listen(3030,listening);

function listening(){
console.log("listening..");
}
app.use(express.static('website'));
app.use(bodyparser.urlencoded({extended:false}));
app.use(bodyparser.json());
Run Code Online (Sandbox Code Playgroud)

  1. 当您想要阅读特定的ID详细信息时,您可以将代码视为..

 app.get('/get/:id',function(req,res){
	
var i;
		 
 for(i=0;i<words.length;++i)
 {
 if(words[i].id==req.params.id){
 res.send(words[i]);
 }
}
console.log("success");
	  
});
Run Code Online (Sandbox Code Playgroud)

  1. 当您输入url时,localhost:3030/get/33它将提供与该id相关的详细信息....并且您也按名称阅读.我的json文件有这个代码的simillar名称你可以得到一个名字的详细信息....并且它没有打印所有的simillar名称

 app.get('/get/:name',function(req,res){
	
var i;
		 
 for(i=0;i<words.length;++i)
 {
 if(words[i].id==req.params.name){
 res.send(words[i]);
 }
}
console.log("success");
	  
});
Run Code Online (Sandbox Code Playgroud)

  1. 如果您想阅读simillar名称详细信息,可以使用此代码.

app.get('/get/name/:name',function(req,res){
word = words.filter(function(val){
  return val.name === req.params.name;
});
res.send(word);
			 
 console.log("success");
	  
});
Run Code Online (Sandbox Code Playgroud)

  1. 如果要读取文件中的所有信息,请使用以下代码.

app.get('/all',sendAll);
 
 function sendAll(request,response){
 response.send(words);

 }
 
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不展示如何使用 Vanilla Javascript 加载文件,而是展示如何使用 Node .js 加载文件 (6认同)
  • require()内置在Node.js中,它不是本机js的一部分 (3认同)

Ser*_* C. 20

你可以像 ES6 模块一样导入它;

import data from "/Users/Documents/workspace/test.json"
Run Code Online (Sandbox Code Playgroud)

  • 那么如何导入动态json文件呢?我认为只有当你处于开发模式时,你才能通过你的方法导入json文件。 (2认同)
  • 你是对的。我只是考虑到这个问题才回答的。 (2认同)
  • 根据 HTML5 规范: &lt;script type="module"&gt; import peopleInSpace from "http://api.open-notify.org/astros.json" assert { type: "json" }; (2认同)

mus*_*ons 18

你可以简单地做:

let json = require('/Users/Documents/workspace/test.json');
Run Code Online (Sandbox Code Playgroud)

请注意:文件加载一次,后续调用将使用缓存.

  • 不对!无需内置JavaScript (2认同)

Ale*_*sky 14

使用Fetch API是最简单的解决方案:

fetch("test.json")
  .then(response => response.json())
  .then(json => console.log(json));
Run Code Online (Sandbox Code Playgroud)

它在Firefox中完美运行,但是在Chrome中,您必须自定义安全设置。

  • 当我尝试这个时,出现以下错误: (node:2065) UnhandledPromiseRejectionWarning: E​​rror: only Absolute urls are support (5认同)

lau*_*hub 11

您可以访问本地文件,具体取决于您的浏览器.但这可能不适用于您应用的所有用户.

为此,您可以尝试以下说明:http://www.html5rocks.com/en/tutorials/file/dndfiles/

加载文件后,您可以使用以下方法检索数据:

var jsonData = JSON.parse(theTextContentOfMyFile);
Run Code Online (Sandbox Code Playgroud)


小智 11

2021 年解决方案(适用于 Chrome 91+)

您导入 JSON 文件的 JS 文件应该是一个模块:

<script type="module" src="script.js"></script>

然后在里面script.js导入你的json文件:

import data from "./data.json" assert { type: "json" };

您可以检查数据是否已加载console.log(data)

来源

  • 收到错误:“从源 'null' 访问 'file:///C:/Users/user/Desktop/load-json.js' 处的脚本已被 CORS 策略阻止:仅协议方案支持跨源请求:http、data、chrome、chrome-extension、chrome-untrusted、https。”,在 Chrome 98 上。在 Firefox 97 上出现类似的 CORS 错误 (6认同)

小智 9

如果您使用的是本地文件,为什么不将数据打包为js对象?

data.js

MyData = { resource:"A",literals:["B","C","D"]}
Run Code Online (Sandbox Code Playgroud)

没有XMLHttpRequests,没有解析,只是MyData.resource直接使用

  • 好的,但是请您完成 javascript 的 MyData.resource 部分,以更清楚地显示其用法。谢谢。 (2认同)

Sar*_*oss 9


正如许多人之前提到的,使用AJAX调用无法正常工作。但是,有一种解决方法。使用输入元素,可以选择文件。

所选文件(.json)必须具有以下结构:

[
    {"key": "value"},
    {"key2": "value2"},
    ...
    {"keyn": "valuen"},
]
Run Code Online (Sandbox Code Playgroud)


<input type="file" id="get_the_file">
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用带有FileReader()的JS来读取文件:

document.getElementById("get_the_file").addEventListener("change", function() {
  var file_to_read = document.getElementById("get_the_file").files[0];
  var fileread = new FileReader();
  fileread.onload = function(e) {
    var content = e.target.result;
    // console.log(content);
    var intern = JSON.parse(content); // Array of Objects.
    console.log(intern); // You can index every object
  };
  fileread.readAsText(file_to_read);
});
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,由于 CORS 策略,用户必须自己选择文件,这基本上可以防止网页开发人员获取他们不应该获取的数据(例如,我可以获取他们的私人文件,我可以制作一个对潜在错误脚本的 GET 请求并在未经用户许可的情况下运行它)。CORS 策略使得这种事情在没有任何后端的情况下处理起来很痛苦,但它使用户更安全。如果你想真正打开一个文件,你必须运行一个可以管理这些请求的网络服务器。 (2认同)

小智 8

非常简单.
将您的json文件重命名为".js"而不是".json".

<script type="text/javascript" src="my_json.js"></script>
Run Code Online (Sandbox Code Playgroud)

所以请正常关注您的代码.

<script type="text/javascript">
var obj = JSON.parse(contacts);
Run Code Online (Sandbox Code Playgroud)

但是,仅仅是为了获取信息,我的json的内容看起来像下面的剪辑.

contacts='[{"name":"bla bla", "email":bla bla, "address":"bla bla"}]';
Run Code Online (Sandbox Code Playgroud)

  • 这不是json文件,而是JS文件。 (3认同)
  • .JS 与 JSON 不同 (2认同)

Tus*_*nik 8

您可以在异步等待的帮助下使用 fetch() 来完成此操作。这是从 url 获取数据的最新且最安全的方式。

const url = "../asset/videoData.json";

const fetchJson = async () => {
  try {
    const data = await fetch(url);
    const response = await data.json();  
  } catch (error) {
    console.log(error);
  }
 };
Run Code Online (Sandbox Code Playgroud)

您也可以使用它从外部 url 获取数据。

  • 对不起这是我的错。修复了它,我想无论谁理解这段代码,他/她都会知道调用它...... (2认同)

Rav*_*r B 7

仅当您的本地主机上运行本地网络服务器时,上述所有解决方案才有效。如果您想在不使用 Web 服务器的情况下实现此目的,则可能需要通过使用文件上传控件上传 JSON 文件来进行一些手动操作。由于安全风险,如果没有本地服务器,浏览器将不会提供此功能。

您也可以在没有本地网络服务器的情况下解析上传的文件。这是我已经实现类似问题的解决方案的示例代码。

 <div id="content">
    <input type="file" name="inputfile" id="inputfile">
    <br>

    <h2>
        <pre id="output"></pre>
    </h2>
</div>
<script type="text/javascript">
    document.getElementById('inputfile')
        .addEventListener('change', function () {

            let fileReader = new FileReader();
            fileReader.onload = function () {
                let parsedJSON = JSON.parse(fileReader.result);
                console.log(parsedJSON);
                // your code to consume the json                    
            }
            fileReader.readAsText(this.files[0]);
        }) 
</script>
Run Code Online (Sandbox Code Playgroud)

就我而言,我想读取本地 JSON 文件并将其显示在桌面上的 html 文件中,这就是我所要做的。

注意:不要尝试使用 JavaScript 自动上传文件,即使由于浏览器施加的相同安全限制,这也是不允许的。


小智 5

只需使用 $.getJSON 然后使用 $.each 来迭代键/值对。JSON 文件和功能代码的内容示例:

    {
        {
            "key": "INFO",
            "value": "This is an example."
        }
    }

    var url = "file.json";         
    $.getJSON(url, function (data) {
        $.each(data, function (key, model) {
            if (model.key == "INFO") {
                console.log(model.value)
            }
        })
    });
Run Code Online (Sandbox Code Playgroud)