我已在本地系统中保存了一个JSON文件,并创建了一个JavaScript文件,以便读取JSON文件并打印出数据。这是JSON文件:
{"resource":"A","literals":["B","C","D"]}
假设这是JSON文件的路径:/Users/Documents/workspace/test.json
。
有人可以帮我写一段简单的代码来阅读JSON文件并用JavaScript打印其中的数据吗?
答案 0 :(得分:151)
要使用javascript读取外部本地JSON文件(data.json),首先要创建data.json文件:
data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
提及脚本源中json文件的路径以及javascript文件。
<script type="text/javascript" src="data.json"></script>
<script type="text/javascript" src="javascrip.js"></script>
从json文件中获取对象
var mydata = JSON.parse(data);
alert(mydata[0].name);
alert(mydata[0].age);
alert(mydata[1].name);
alert(mydata[1].age);
有关详细信息,请参阅this reference。
答案 1 :(得分:107)
The loading of a .json
file是一个异步操作,因此它需要指定一个在文件加载后执行的回调函数。
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"
等。
答案 2 :(得分:68)
您无法对本地资源进行AJAX调用,因为请求是使用HTTP进行的。
解决方法是运行本地Web服务器,提供文件并对localhost进行AJAX调用。
在帮助您编写代码以阅读JSON方面,您应该阅读jQuery.getJSON()
的文档:
答案 3 :(得分:24)
[{"name":"ay","id":"533"},
{"name":"kiy","id":"33"},
{"name":"iy","id":"33"},
{"name":"iy","id":"3"},
{"name":"kiy","id":"35"},
{"name":"kiy","id":"34"}]
&#13;
'utf8'
的{{1}}参数:这使得它返回的不是readFileSync
(尽管Buffer
可以处理它),而是一个字符串。我正在创建一个服务器来查看结果......
JSON.parse
&#13;
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());
&#13;
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");
});
时,它会提供与该ID相关的详细信息....您还会按名称阅读。我的json文件有这个代码的simillar名称,你可以得到一个名字的详细信息....而且它没有打印所有的simillar名称
localhost:3030/get/33
&#13;
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");
});
&#13;
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");
});
&#13;
答案 4 :(得分:13)
您可以这样做:
let json = require('/Users/Documents/workspace/test.json');
请注意:文件已加载一次,后续调用将使用缓存。
答案 5 :(得分:11)
您可以访问本地文件,具体取决于您的浏览器。但这可能不适用于您应用的所有用户。
为此,您可以尝试此处的说明:http://www.html5rocks.com/en/tutorials/file/dndfiles/
加载文件后,您可以使用以下方法检索数据:
var jsonData = JSON.parse(theTextContentOfMyFile);
答案 6 :(得分:10)
如果您使用的是本地文件,为什么不将数据打包为js对象?
<强> data.js 强>
MyData = { resource:"A",literals:["B","C","D"]}
没有 XMLHttpRequests ,没有解析,只是直接使用MyData.resource
答案 7 :(得分: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"}]';
答案 8 :(得分:6)
使用Fetch API是最简单的解决方案:
fetch("test.json")
.then(response => response.json())
.then(json => console.log(json));
它在Firefox中运行良好,但在Chrome中,您必须自定义安全设置。
答案 9 :(得分:5)
正如之前提到的许多人一样,使用AJAX调用并不起作用。但是,有一种解决方法。使用input元素,您可以选择文件。
所选文件(.json)需要具有以下结构:
[
{"key": "value"},
{"key2": "value2"},
...
{"keyn": "valuen"},
]
<input type="file" id="get_the_file">
然后你可以使用JS和FileReader()来读取文件:
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);
});
答案 10 :(得分:2)
只需使用$ .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)
}
})
});
答案 11 :(得分:2)
您可以使用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;
};
}
如果您将文件放在其他文件夹中,请提及完整路径而不是文件名。
答案 12 :(得分:1)
您可以像ES6模块一样将其导入;
import data from "/Users/Documents/workspace/test.json"
答案 13 :(得分:1)
一个简单的解决方法是将您的JSON文件放在本地运行的服务器中。从终端转到项目文件夹并在某个端口号上启动本地服务器,例如8181
python -m SimpleHTTPServer 8181
然后浏览 http://localhost:8181/ 应显示所有文件,包括JSON。如果你还没有安装python,请记得安装。
答案 14 :(得分: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);
});
答案 15 :(得分:1)
我喜欢Stano / Meetar上面评论过的内容。我用它来读取.json文件。 我使用Promise扩展了他们的例子。 这是相同的plunker。 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);
});
对于DRY,可以将JSON的读取移动到另一个函数中;但这里的例子更多的是展示如何使用promises。
答案 16 :(得分:1)
由于您拥有Web应用程序,因此您可能拥有客户端和服务器。
如果您只有浏览器,并且想要从浏览器中运行的javascript中读取本地文件,则表示您只有一个客户端。出于安全考虑,浏览器不应该让你这样做。
然而,正如lauhub上面解释的那样,这似乎有效:
http://www.html5rocks.com/en/tutorials/file/dndfiles/
其他解决方案是在您的计算机的某个位置设置一个Web服务器(在windows中很小或在Linux中使用Monkey),并使用XMLHttpRequest或D3库,从服务器请求文件并读取它。服务器将从本地文件系统获取文件,并通过Web将其提供给您。
答案 17 :(得分:0)
使用 jQuery
和 ajax
可以很好地读取 JSON
文件并操作数据
$(document).ready(function () {
$.ajax({
url: 'country.json',
type: 'GET',
dataType: 'json',
success: function (code, statut) {
for (let i in code) {
console.log(i)
}
}
});
});
答案 18 :(得分:0)
仅当您在本地主机上运行本地Web服务器时,上述所有解决方案才有效。如果要在没有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>
就我而言,我想读取本地JSON文件并将其显示在桌面上的html文件中,这就是我要做的一切。
注意:请勿尝试使用JavaScript自动上传文件,即使由于浏览器施加的相同安全限制也不允许这样做。
答案 19 :(得分:0)
导入 JSON 文件的 JS 文件应该是一个模块:
<script type="module" src="script.js"></script>
然后在 script.js
中导入您的 json
文件:
import data from "./data.json" assert { type: "json" };
您可以使用 console.log(data)
答案 20 :(得分:0)
您可以使用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>
答案 21 :(得分:0)
您可以使用d3.js导入JSON文件。只需在您的html正文上调用d3:
<script src="https://d3js.org/d3.v5.min.js"></script>
然后将其放在您的js脚本中:
d3.json("test.json").then(function(data_json) {
//do your stuff
})
答案 22 :(得分:0)
如果您可以运行本地Web服务器(如上面建议的Chris P),并且您可以使用jQuery,则可以尝试http://api.jquery.com/jQuery.getJSON/
答案 23 :(得分:-1)
我接受了Stano's个很好的答案,并将其包裹在一个诺言中。如果您没有诸如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>'
});
答案 24 :(得分:-2)
所以,如果你打算和#34; Apache Tomcat&#34;用于托管您的JSON文件,
1&GT;启动服务器后,通过访问此URL验证您的Apache Tomcat已启动并运行:&#34; localhost:8080&#34; -
2 - ;接下来,转到&#34; webapps&#34;文件夹 - &#34; C:\ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ webapps&#34;。并且,创建项目文件夹或复制项目文件夹。
4&GT;就是这样。你完成了!只需转到 - &#34; http://localhost:8080/ $ project_name $ / $ jsonFile_name $ .json&#34;