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


255

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

{"resource":"A","literals":["B","C","D"]}

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

有人能帮我写一个简单的代码来读取JSON文件并以JavaScript打印数据吗?


Answers:


93

不能让一个AJAX调用本地资源的请求是使用HTTP制成。

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

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

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


2
您能否指导我在这种情况下如何运行本地服务器?为了使本地服务器运行,我需要做什么?
user2864315

2
您正在使用什么环境?视窗?Linux的?
克里斯·皮克福德

25
这仅适用于AJAX:在Chrome浏览器下,并且已经使用HTML5的File API做到了。该问题未询问有关AJAX的问题。
lauhub

10
如果您安装了python,则可以使用命令行python -m SimpleHTTPServer 8888http://localhost:8888/在浏览器(Windows或Mac)中打开。 8888是端口,可以更改。
geotheory,2014年

3
要更新@geotheory的注释,使用Python 3的命令是python -m http.server 8888
Marc Stober

191

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

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. 在脚本源中提及json文件的路径以及javascript文件。

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. 从json文件获取对象

    var mydata = JSON.parse(data);
    alert(mydata[0].name);
    alert(mydata[0].age);
    alert(mydata[1].name);
    alert(mydata[1].age);

有关更多信息,请参见此参考


8
如果您可以修改文件,或者文件内容中没有正确的JSON,则此方法有效。例如,上述示例内容data.json未通过验证:jsonlint.com,因为它实际上是JavaScript。删除包装的单引号会将其变成纯JavaScript。
杰森·艾勒2014年

3
注意: JSON.parse某些较旧的浏览器(以您的IE浏览器)不支持。请参阅MDN的浏览器兼容性表window.JSON
Sumner Evans

不应该JSON.parse(data); 因为数据是字符串而无法工作?
我叫我

259
这不是正确答案。答案中的示例未加载json文件。实际上,它只是加载另一个JavaScript文件,该文件将一些硬编码的json作为名为的变量存储data。如果您从json周围删除了字符串引号,则data.json 甚至不需要使用JSON.parse。问题是如何加载JSON文件,而不是如何将JSON硬编码到另一个javascript文件中,然后加载它。
wuliwong 2015年

1
JSON.parse(window.data);将提供更好的信息scope中的data变量。
阿卡什(Akash)

126

.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);
});

此功能也用于加载.html.txt文件,通过重写MIME类型参数"text/html""text/plain"等等。


14
这是非常糟糕的做法!在Google Chrome浏览器中,您无法向本地资源发出XmlHttpRequest。
mhaseeb

11
@mhaseeb如果资源与请求系统具有相同的域/协议(因为它是本地的),则可以(即使现在,将来也可以)。查找CORS。
GreySage

11
在使用当前的Chrome浏览器尝试此操作时,我收到“仅协议方案支持跨源请求:http,数据,chrome,chrome扩展名,https”。-因此没有文件协议,这暗示在这里@GreySage
eis

2
XMLHttpRequest.status返回一个数值。这仅起作用,因为javascript在后台执行操作以使您的代码不会消失。应该如下所示:rawFile.status === 200
user3044394 '18

1
您还可以进行设置rawFile.responseType = 'json';,使其自动解析json对象,只需确保传递rawFile.response而不是传递rawFile.responseText给回调即可。
Ignat


29
  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"}]

  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());

  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");
	  
});

  1. 当您输入url时,localhost:3030/get/33它将提供与该ID相关的详细信息。我的json文件具有此代码的相似名称,您可以获得一个名称详细信息....并且它没有打印所有相似名称

 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");
	  
});

  1. 并且,如果您想读取类似名称的详细信息,则可以使用此代码。

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");
	  
});

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

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

 }
 


require()来自何处?我的浏览器找不到它
shieldgenerator7 '19

require()是内置函数。使用require()可以包含存在于单独文件中的模块。require的基本功能是读取javascript文件,执行该文件,然后继续返回导出对象
Syed Ayesha Bebe

5
require()内置于Node.js中,它不是本机js的一部分
dementis

这个答案没有显示如何使用Vanilla Javascript加载文件,而是如何使用Node .js加载文件
Amos Long,

18

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

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

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


当我尝试这一操作时,出现以下错误:(node:2065)UnhandledPromiseRejectionWarning:错误:仅支持绝对网址
Jangid

13


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

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

[
    {"key": "value"},
    {"key2": "value2"},
    ...
    {"keyn": "valuen"},
]


<input type="file" id="get_the_file">

然后,您可以使用带有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);
});

您在哪里输入文件名?
shieldgenerator19

1
在这种情况下,由于CORS政策,用户必须自己选择文件,这基本上阻止了网页开发人员获取他们不应该获取的数据(例如,我可以获取其私人文件,我可以制作一个GET对潜在错误脚本的请求并在未经用户许可的情况下运行它)。在没有任何后端的情况下,CORS策略会使这类东西很难处理,但它使用户更安全。如果要实际打开文件,则必须运行可以管理这些请求的Web服务器。
莎拉·克罗斯


9

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

data.js

MyData = { resource:"A",literals:["B","C","D"]}

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


1
好的,但是请您完成javascript的MyData.resource部分,以更清楚地显示其用法。谢谢。

9

很简单。
将您的json文件重命名为“ .js”而不是“ .json”。

<script type="text/javascript" src="my_json.js"></script>

因此,请正常遵循您的代码。

<script type="text/javascript">
var obj = JSON.parse(contacts);

但是,仅作为参考,json的内容看起来像下面的片段。

contacts='[{"name":"bla bla", "email":bla bla, "address":"bla bla"}]';

4
这不是json文件,而是JS文件。
卡皮克

9

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

import data from "/Users/Documents/workspace/test.json"

那么如何导入动态json文件呢?我认为您只能在处于开发方式下通过方法导入json文件。
钻石

你是对的。我只考虑了这个问题就回答了。
Serhan C.

6

只需使用$ .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)
            }
        })
    });

3

您可以使用XMLHttpRequest()方法:

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var myObj = JSON.parse(this.responseText);
        //console.log("Json parsed data is: " + JSON.stringify(myObj));
       }
    };
xmlhttp.open("GET", "your_file_name.json", true);
xmlhttp.send();

您可以使用console.log语句(注释掉)查看myObj的响应。

如果您知道AngularJS,则可以使用$ http:

MyController.$inject = ['myService'];
function MyController(myService){

var promise = myService.getJsonFileContents();

  promise.then(function (response) {
    var results = response.data;
    console.log("The JSON response is: " + JSON.stringify(results));
})
  .catch(function (error) {
    console.log("Something went wrong.");
  });
}

myService.$inject = ['$http'];
function myService($http){

var service = this;

  service.getJsonFileContents = function () {
    var response = $http({
      method: "GET",
      url: ("your_file_name.json")
    });

    return response;
  };
}

如果文件在其他文件夹中,请提及完整路径而不是文件名。


2

由于您具有Web应用程序,因此您可能具有客户端和服务器。

如果只有浏览器,并且想从浏览器中运行的javascript读取本地文件,则意味着您只有一个客户端。出于安全原因,浏览器不应让您这样做。

但是,正如lauhub上面所解释的,这似乎可行:

http://www.html5rocks.com/zh-CN/tutorials/file/dndfiles/

其他解决方案是在计算机上的某个位置设置Web服务器(在Windows中为微型服务器,在Linux中为Monkey),并使用XMLHttpRequest或D3库,从服务器请求文件并读取文件。服务器将从本地文件系统中获取文件,然后通过网络将其提供给您。


1

我喜欢Stano / Meetar上面的评论。我用它来读取.json文件。我使用Promise扩展了他们的示例。这是同样的小插曲。 https://plnkr.co/edit/PaNhe1XizWZ7C0r3ZVQx?p=preview

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("DATA.json", function(text){
//     var data = JSON.parse(text);
//     console.log(data); 
// });


var task1 = function (){
  return new Promise (function(resolve, reject){
    readTextFile("DATA.json", function(text){
    var data = JSON.parse(text);
    console.log('task1 called');
    console.log(data);
    resolve('task1 came back');
    }); 
  });
};

var task2 = function (){
  return new Promise (function(resolve, reject){
    readTextFile("DATA2.json", function(text){
    var data2 = JSON.parse(text);
    console.log('task2 called');
    console.log(data2);
    resolve('task2 came back');
    });
  });
}

Promise.race([task1(), task2()])
       .then(function(fromResolve){
          console.log(fromResolve); 
       });

JSON的读取可以移到另一个函数中进行DRY;但是这里的示例更多地展示了如何使用Promise。


1

您必须创建一个新的XMLHttpRequest实例并加载json文件的内容。

这个技巧对我有用(https://codepen.io/KryptoniteDove/post/load-json-file-locally-using-pure-javascript):

 function loadJSON(callback) {   

    var xobj = new XMLHttpRequest();
        xobj.overrideMimeType("application/json");
    xobj.open('GET', 'my_data.json', true); // Replace 'my_data' with the path to your file
    xobj.onreadystatechange = function () {
          if (xobj.readyState == 4 && xobj.status == "200") {
            // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
            callback(xobj.responseText);
          }
    };
    xobj.send(null);  
 }

 loadJSON(function(response) {
    // Parse JSON string into object
    var actual_JSON = JSON.parse(response);
 });

仍可在Firefox上运行,但不能在Chrome上运行:Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https。您可以使用json2js将任何JSON转换为.JS文件。
lalengua

1

一种简单的解决方法是将JSON文件放入本地运行的服务器中。为此,从终端转到您的项目文件夹,并在某个端口号上启动本地服务器,例如8181

python -m SimpleHTTPServer 8181

然后浏览到http:// localhost:8181 /应该显示所有文件,包括JSON。如果还没有,请记住安装python。



-1

您可以使用D3处理回调,并加载本地JSON文件data.json,如下所示:

<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>

<script>
  d3.json("data.json", function(error, data) {
    if (error)
      throw error;
    console.log(data);
  });
</script>

-2

我接受了Stano的出色回答,并将其包装成一个承诺。如果您没有诸如node或webpack之类的选项可以依靠从文件系统加载json文件,这可能会很有用:

// wrapped XMLHttpRequest in a promise
const readFileP = (file, options = {method:'get'}) => 
  new Promise((resolve, reject) => {
    let request = new XMLHttpRequest();
    request.onload = resolve;
    request.onerror = reject;
    request.overrideMimeType("application/json");
    request.open(options.method, file, true);
    request.onreadystatechange = () => {
        if (request.readyState === 4 && request.status === "200") {
            resolve(request.responseText);
        }
    };
    request.send(null);
});

您可以这样称呼它:

readFileP('<path to file>')
    .then(d => {
      '<do something with the response data in d.srcElement.response>'
    });

-3

因此,如果您打算使用“ Apache Tomcat”来托管JSON文件,

1>启动服务器后,通过转到以下URL验证您的Apache Tomcat是否已启动并正在运行:“ localhost:8080”-

在此处输入图片说明



2>接下来,转到“ webapps”文件夹 -“ C:\ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ webapps”。并且,创建一个项目文件夹或复制您的项目文件夹。

在此处输入图片说明


3>将您的json文件粘贴到那里。 在此处输入图片说明



4>就这样。大功告成!只需转到-“ http:// localhost:8080 / $ project_name $ / $ jsonFile_name $ .json”在此处输入图片说明


不要求使用TomCat服务器
Chandra Kanth,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.