如何使用 Javascript 将数据写入 JSON 文件

IT技术 javascript json ajax object
2021-03-04 03:26:20

例如,我有一个.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 文件的信息。

任何帮助,将不胜感激!

3个回答

您必须清楚“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 格式JSON.stringify,并使用另一个 ajax 调用将数据发送到服务器进行存储或其他操作。

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

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

可以使用 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'));

不幸的是,今天(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 服务器的文章。

通过使用搜索机器,您可以找到“免费的 PHP 虚拟主机*”或“免费的 Node.js 虚拟主机”。对于 PHP 服务器,我会推荐000webhost.com,对于 Node.js,我会推荐查看和阅读此列表

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) 错误,对此有何想法?
2021-05-08 03:26:20
@ShekharPatel,405 错误可以追溯到 Web 服务器的配置和管理对网站内容的访问的安全性。您向其发送 Post 请求的服务器(您站点的服务器)似乎已配置为阻止 Post 请求。您可以配置您的服务器以允许 Post 请求。有关更多详细信息,请访问checkupdown.com/status/E405.html
2021-05-14 03:26:20