【问题标题】:How to write data to a JSON file using Javascript如何使用 Javascript 将数据写入 JSON 文件
【发布时间】:2015-12-09 08:25:18
【问题描述】:

例如,我有一个 .JSON 文件,其中包含以下内容:

[{"honda": "accord", "color": "red"},{"ford": "focus", "color": "black"}]

将另一个对象 {"nissan": "sentra", "color": "green"} 推入此 .json 数组以使 .json 文件看起来像这样的 javascript 代码是什么

[{"honda": "accord", "color": "red"},{"ford": "focus", "color": "black"},{"nissan": "sentra", "color": "green"}]

我问的原因是我在网上找到很多关于如何使用 AJAX 从 .json 文件中提取数据但不使用 AJAX 将新数据写入 .json 文件以更新 .json 文件的信息数据。

任何帮助将不胜感激!

【问题讨论】:

  • 解决方案取决于您使用的服务器类型。它很可能涉及向服务器端脚本发送经过身份验证的 POST 请求。
  • 你必须获取数据,解析它,改变它,序列化它,将它发送回服务器并持久化它。你哪部分有问题?请注意,持久化部分(写入文件)与 JavaScript 无关。这一切都由服务器处理。您使用的是哪种服务器端语言?
  • 我假设您的文件是某个服务器部署的 Web 应用程序的一部分,并且您使用 AJAX 将内容传输到浏览器,然后在那里捕获新信息,并希望将 AJAX 请求发送到上的某个更新方法带有新信息的服务器,这让 webapp 在那里更新文件。
  • 如果您想知道如何使用节点编写文件,check this out。如果您想知道如何在 javascript 中将元素添加到数组中,这是非常基础的,您可以在任何 javascript 教程页面中轻松找到相关信息。如果是后者,您可以改写您的问题,这实际上与 JSON 无关,这只是将 javascript 对象表示为字符串的一种方式。如果它是关于文件 i/o 或其他东西,它也可以更好地措辞。我只是不知道你在问什么。

标签: javascript json ajax object


【解决方案1】:

您必须清楚“JSON”是什么意思。

有些人错误地使用术语 JSON 来指代普通的旧 JavaScript 对象,例如 [{a: 1}]。这个恰好是一个数组。如果要向数组中添加新元素,只需 push 即可,如

var arr = [{a: 1}];
arr.push({b: 2});

< [{a: 1}, {b: 2}]

JSON 一词也可用于指代以 JSON 格式编码的字符串:

var json = '[{"a": 1}]';

注意(单)引号表示这是一个字符串。如果你有这样一个从某个地方获得的字符串,你需要先将它解析成一个 JavaScript 对象,使用JSON.parse:

var obj = JSON.parse(json);

现在您可以以任何您想要的方式操作对象,包括如上所示的push。如果你想把它放回 JSON 字符串,那么你使用JSON.stringify:

var new_json = JSON.stringify(obj.push({b: 2}));
'[{"a": 1}, {"b": 1}]'

JSON 也被用作格式化数据的常用方法,以便将数据传输到服务器或从服务器传输数据,并可以将其保存(持久化)。这就是 ajax 的用武之地。Ajax 用于从服务器获取数据(通常为 JSON 格式)和/或将 JSON 格式的数据发送到服务器。如果您收到来自 JSON 格式的 ajax 请求的响应,您可能需要如上所述 JSON.parse 它。然后您可以操作该对象,使用JSON.stringify 将其重新转换为 JSON 格式,并使用另一个 ajax 调用将数据发送到服务器进行存储或其他操作。

您使用术语“JSON 文件”。通常,“文件”一词用于指代某些设备上的物理文件(不是您在代码中处理的字符串或 JavaScript 对象)。浏览器无法访问您机器上的物理文件。它无法读取或写入它们。实际上,浏览器甚至没有“文件”的概念。因此,您不能只在本地机器上读取或写入一些 JSON 文件。如果您将 JSON 发送到服务器或从服务器发送 JSON,那么当然,服务器可能会将 JSON 存储为文件,但服务器更有可能基于从数据库中检索的数据基于某些 ajax 请求构建 JSON ,或者在一些ajax请求中解码JSON,然后将相关数据存储回其数据库中。

您是否真的有一个“JSON 文件”,如果有,它存在于哪里以及您从哪里获得它?您是否有一个 JSON 格式的字符串,需要对其进行解析、mainpulate 并转回一个新的 JSON 格式的字符串?您是否需要从服务器获取 JSON,并对其进行修改,然后将其发送回服务器?还是您的“JSON 文件”实际上只是一个 JavaScript 对象,您只需要使用普通的 JavaScript 逻辑进行操作?

【讨论】:

    【解决方案2】:

    可以使用 JSON.stringify 将 JSON 写入本地存储以序列化 JS 对象。您不能仅使用 JS 写入 JSON 文件。仅 cookie 或本地存储

        var obj = {"nissan": "sentra", "color": "green"};
    
    localStorage.setItem('myStorage', JSON.stringify(obj));
    

    稍后检索对象

    var obj = JSON.parse(localStorage.getItem('myStorage'));
    

    【讨论】:

      【解决方案3】:

      很遗憾,今天(2018 年 9 月)您找不到用于客户端文件写入的跨浏览器解决方案。

      例如:在某些浏览器(如 Chrome)中,我们今天有这种可能性,我们可以使用 FileSystemFileEntry.createWriter() 编写客户端调用,但根据文档:

      此功能已过时。尽管它在某些浏览器中可能仍然有效,但不鼓励使用它,因为它可能随时被删除。尽量避免使用它。


      对于 IE(但不是 MS Edge),我们也可以使用 ActiveX,但这仅适用于该客户端。

      如果您想跨浏览器更新 JSON 文件,您必须同时使用服务器端和客户端。

      客户端脚本

      在客户端,您可以向服务器发出请求,然后您必须从服务器读取响应。或者您也可以使用 FileReader 读取文件。对于写入文件的跨浏览器,您必须有一些服务器(请参阅下面的服务器部分)。

      var xhr = new XMLHttpRequest(),
          jsonArr,
          method = "GET",
          jsonRequestURL = "SOME_PATH/jsonFile/";
      
      xhr.open(method, jsonRequestURL, true);
      xhr.onreadystatechange = function()
      {
          if(xhr.readyState == 4 && xhr.status == 200)
          {
              // we convert your JSON into JavaScript object
              jsonArr = JSON.parse(xhr.responseText);
      
              // we add new value:
              jsonArr.push({"nissan": "sentra", "color": "green"});
      
              // we send with new request the updated JSON file to the server:
              xhr.open("POST", jsonRequestURL, true);
              xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
              // if you want to handle the POST response write (in this case you do not need it):
              // xhr.onreadystatechange = function(){ /* handle POST response */ };
              xhr.send("jsonTxt="+JSON.stringify(jsonArr));
              // but on this place you have to have a server for write updated JSON to the file
          }
      };
      xhr.send(null);
      

      服务器端脚本

      你可以使用很多不同的服务器,但我想写一些关于 PHP 和 Node.js 服务器的文章。

      通过使用搜索机,您可以找到“free PHP Web Hosting*”或“free Node.js Web Hosting”。对于 PHP 服务器,我推荐 000webhost.com,对于 Node.js,我推荐查看和阅读 this list

      PHP服务器端脚本解决方案

      用于读取和写入 JSON 文件的 PHP 脚本:

      <?php
      
      // This PHP script must be in "SOME_PATH/jsonFile/index.php"
      
      $file = 'jsonFile.txt';
      
      if($_SERVER['REQUEST_METHOD'] === 'POST')
      // or if(!empty($_POST))
      {
          file_put_contents($file, $_POST["jsonTxt"]);
          //may be some error handeling if you want
      }
      else if($_SERVER['REQUEST_METHOD'] === 'GET')
      // or else if(!empty($_GET))
      {
          echo file_get_contents($file);
          //may be some error handeling if you want
      }
      ?>
      

      Node.js 服务端脚本解决方案

      我认为 Node.js 对于初学者来说有点复杂。这与浏览器中的普通 JavaScript 不同。在开始使用 Node.js 之前,我建议您阅读两本书中的一本:

      用于读取和写入 JSON 文件的 Node.js 脚本:

      var http = require("http"),
          fs = require("fs"),
          port = 8080,
          pathToJSONFile = '/SOME_PATH/jsonFile.txt';
      
      http.createServer(function(request, response)
      {
          if(request.method == 'GET')
          {
              response.writeHead(200, {"Content-Type": "application/json"});
              response.write(fs.readFile(pathToJSONFile, 'utf8'));
              response.end();
          }
          else if(request.method == 'POST')
          {
              var body = [];
      
              request.on('data', function(chunk)
              {
                  body.push(chunk);
              });
      
              request.on('end', function()
              {
                  body = Buffer.concat(body).toString();
                  var myJSONdata = body.split("=")[1];
                  fs.writeFileSync(pathToJSONFile, myJSONdata); //default: 'utf8'
              });
          }
      }).listen(port);
      

      Node.js 的相关链接:

      【讨论】:

      • 在使用客户端脚本保存时,我收到方法不允许 (405) 错误,对此有什么想法吗?
      • @ShekharPatel,405 错误可以追溯到 Web 服务器的配置和管理对网站内容的访问的安全性。您向其发送 Post 请求的服务器(您的站点的服务器)似乎已配置为阻止 Post 请求。您可以配置您的服务器以允许 Post 请求。更多详情,请转至checkupdown.com/status/E405.html
      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 2018-12-25
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多