【问题标题】:Writing a json object to a text file in javascript在javascript中将json对象写入文本文件
【发布时间】:2017-06-22 00:00:11
【问题描述】:

我在 javascript 中有一个 JSON 对象。我想简单地将 JSON 对象写入文本文件。从到目前为止我遇到的情况来看,由于客户端的安全问题,不可能这样做。有解决方法吗?如果最初放置一些虚拟值,是否可以修改已经存在的文件?

谢谢

【问题讨论】:

标签: javascript json


【解决方案1】:

您可以做的一件事是将 JSON 设置为即时下载。

var data = "{name: 'Bob', occupation: 'Plumber'}";
var url = 'data:text/json;charset=utf8,' + encodeURIComponent(data);
window.open(url, '_blank');
window.focus();

工作演示:http://jsfiddle.net/sLq3F/

除此之外,由于安全原因,您不能将 JSON 写入客户端的文件。 (否则您可以访问您网站用户的文件系统。)您必须为此使用服务器端语言,并将文件存储在服务器端。


更正:看起来您可以写入文件,即用户文件系统的“沙盒部分”。请参阅下面 Kevin Jantzer 的评论。

另一个更正:抱歉,文件系统 API 未使用。来自 HTMl5Rocks 网站:“2014 年 4 月,在 public-webapps 上宣布文件系统 API 规范应被视为已死。其他浏览器对实现它没有兴趣。”

【讨论】:

  • 虽然,您可以使用 HTML5 的新 FileSystem APIs 写入文件
  • 来自@KevinJantzer 的链接:“2014 年 4 月,在 public-webapps 上宣布文件系统 API 规范应被视为已死。其他浏览器对实现它几乎没有兴趣。”跨度>
  • 抱歉,文件系统 API 不可靠。来自 HTMl5Rocks 网站:“2014 年 4 月,在 public-webapps 上宣布文件系统 API 规范应该被视为已死。其他浏览器对实现它没有兴趣。”
  • 此方法因“复杂” jsons 失败,例如 {a:{1,2,3}, b:"33", c:{1,"a"}},但如果 encodeURIComponentJSON.stringify替换,则结果正常。
  • @MiguelVazq 在@ktm5124 的示例中要注意的是data 是一个字符串,而不是一个原始对象。你可以只使用JSON.stringify(),但这会给你一个包含原始JSON字符串的URL,如果对象包含一个URL(或者实际上是任何带有斜杠的字符串),这可能会导致问题。如果您从原始对象开始,最可靠的方法是stringify() 使用encodeURIComponent(),例如:var url = 'data:text/json;charset=utf8,' + encodeURIComponent(JSON.stringify(data));
【解决方案2】:

也许这个解决方案更优雅一点,在 Chrome、FF 和 ie7 到 ie10 中进行了测试,使用文本、JSON、PDF 和 XLS 数据进行了测试(使用适当的内容类型)

要么为 saveFile() 函数提供数据 blob,要么在 type 设置为空且您的数据位于 [] 之间的情况下动态创建数据 blob

在本例中,我们将只对settings 对象进行字符串化,并正确设置数据类型。

settings = { any_kind_of_object: true };
json_str = JSON.stringify(settings);

saveFile('yourfilename.json', "data:application/json", new Blob([json_str],{type:""}));

function saveFile (name, type, data) {
    if (data != null && navigator.msSaveBlob)
        return navigator.msSaveBlob(new Blob([data], { type: type }), name);

    var a = $("<a style='display: none;'/>");
    var url = window.URL.createObjectURL(new Blob([data], {type: type}));
    a.attr("href", url);
    a.attr("download", name);
    $("body").append(a);
    a[0].click();
    setTimeout(function(){  // fixes firefox html removal bug
        window.URL.revokeObjectURL(url);
        a.remove();
    }, 500);  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多