在网页上显示本地json文件中的数据

时间:2018-12-04 11:06:21

标签: javascript html json

我目前正在尝试将本地JSON文件(universities.json)中的数据显示到网页上的表格中。这是我当前的代码:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>

</head>
<body>
    <div id="id01"></div>

<script>
var xmlhttp = new XMLHttpRequest();
var url = "universities.json";

xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var myArr = JSON.parse(this.responseText);
        myFunction(myArr);
    }
};
xmlhttp.open("GET", url, true);
xmlhttp.send();

function myFunction(arr) {
    var out = "";
    var i;
    for(i = 0; i < arr.length; i++) {
        out += '<a href="' + arr[i].url + '">' + 
        arr[i].display + '</a><br>';
    }
    document.getElementById("id01").innerHTML = out;
}
</script>
</body>
</html>

我在这里搜索了很多问题,并完成了无数的google搜索,但是我无法找到为什么这行不通。这只是代码的一次迭代。我也尝试了其他各种方法。我知道我没有为表添加任何代码,但是我删除了该代码,直到可以获取任何格式的数据为止。

任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:3)

您的浏览器安全性不允许您发出此请求,并且您收到CORS错误,为了绕过此错误,您有两个以下选择。

1。更改浏览器安全设置。 例如,在Chrome中,您可以执行以下操作:导航到Chrome安装文件夹并使用以下命令运行chrome,然后尝试在浏览器中再次进行测试

chrome.exe --allow-file-access-from-files

2。在本地运行Web服务器,并将所有文件放在同一路径中。

答案 1 :(得分:0)

无法从codeandbox内提供文件。 但是,下面的(服务器端)代码示例可以解决问题:

const http = require("http");

http
  .createServer((req, res) => {
    if (req.method === "GET" && req.url == "/") {
      res.writeHead(200, {
        "Content-Type": "text/html"
      });
      res.end(`<!DOCTYPE html>
        <html>
          <body>
            <div id="id01"></div>
          </body>
          <script>
            const getJson = () => {
              let xhr = new XMLHttpRequest();
              xhr.open('GET', '/getjson', true);
              xhr.onload = () => {
                if (xhr.readyState == 4 && xhr.status == 200)
                  json = JSON.parse(xhr.responseText);
                  jsons = [];
                  Object.values(json).forEach((value,index) => {
                    jsons.push('<a href="'+value+'">"'+Object.keys(json)[index]+'"</a>');
                  });
                  jsons.forEach(item => document.querySelector('#id01').innerHTML += item+'<br>');

              };
              xhr.send();
            };
            getJson();
          </script>
        </html>`);
    }
    if (req.method === "GET" && req.url.match(/getjson/)) {
      let json = `{ "Univ1": "https://univ1.edu", "Univ2": "https://univ2.edu", "Univ3": "https://univ3.edu" }`;
      res.writeHead(200, {
        "Content-Type": "application/json"
      });
      res.end(json);
    }
  })
  .listen(8080);

https://codesandbox.io/s/j2yj6577q3

答案 2 :(得分:0)

CORS错误是由于Mahdi前面提到的浏览器安全性引起的。

如果您只是通过浏览器中的本地驱动器打开了HTML文件(仅客户端),并且未托管在本地或远程网络服务器上,而不是使用XMLHttpRequest(),应尝试从纯JavaScript使用FileReader()。做这样的事情:

  function fnUploadFile() {
    var objFileReader;
    var inputFile;
    var flLocalFile;

    if (window.File && window.FileReader && window.FileList && window.Blob) {
      // All the File APIs are supported.
    } else {
      alert('A required API is not supported on this browser. You need HTML5 browsers!');
      return; // abort execution
    }

    inputFile = document.getElementById('inLocallySelectedFile');

    if (!inputFile) {
      alert("File selector control not found!");
    } else if (!inputFile.files[0]) {
      alert("Have you selected a file yet? Select a file before clicking 'Process File'!");
    } else {
      // open and read file with JavaScript FileReader
      flLocalFile = inputFile.files[0];
      objFileReader = new FileReader();
      objFileReader.onload = function(event) {
        // event.target == FileReader
        var contents = event.target.result;
        fnConvertToJSON(contents);
      };
      objFileReader.readAsText(flLocalFile);
    }

    function fnConvertToJSON(results) {
      var JSONData = JSON.parse(results);
      var ctrlJSONDisplay = document.getElementById('JsonDataDisplay')
      ctrlJSONDisplay.innerHTML = "<strong><u>" + JSONData['name'] +
        "</u></strong> is <strong><u>" + JSONData['age'] +
        "</u></strong> years old and from the <strong><u>" +
        JSONData['country'] + "</u></strong>";
    }

  }
    <form id="frmGetLocalFile" name="frmGetLocalFile" method="post">
      <h1>Select Your File</h1>
      <input type='file' accept="*" name='inLocallySelectedFile' id='inLocallySelectedFile'>
      <input type='button' id='btProcessFile' name="btProcessFile" value='Process File' onclick='fnUploadFile();'>
    </form>


    <div>
      <p>Assuming JSON File Content:</p>
      <pre>
{ 
   "name": "John", 
   "age" : 30, 
   "country" : "UK" 
}
</pre>
      <hr>
      <p>JSON Data read from local file:</p>
      <p id="JsonDataDisplay"></p>
    </div>

See code in JSFiddle: https://jsfiddle.net/TechOnTheBeach/3gsa2y75/3/