【问题标题】:Using FileReader to read a JSON file?使用 FileReader 读取 JSON 文件?
【发布时间】:2019-07-04 04:43:32
【问题描述】:

我正在尝试读取用户上传的 JSON 文件,并尝试将其复制到数组中。但是,使用 .readAsText(),我得到的返回具有字符串的格式(显然),例如包括 \" 和 \n 以及其他类似字符串的属性。

有没有一种方法可以使用 FileReader(或任何其他形式的不涉及服务器的读取文件)来读取 JSON 文件并让它只返回纯 JSON?

例如,让它返回

[
  {"hello": "world"}
]

[{"hello": "world"}]

而不是

"[\n{\"hello\": \"world\"}\n]"

?

编辑:我现在知道 JSON.parse(text) 方法,但是在解析 FileReader 对象时出现错误

 let fileUploaded = new FileReader();
 fileUploaded.readAsText(MY_JSON_FILE);
 console.log(JSON.parse(fileUploaded));

它返回错误error TS2345: Argument of type 'FileReader' is not assignable to parameter of type 'string'

我可以将我使用 FileReader 读取的内容获取到另一个字符串 var,然后解析该新 var 吗?

【问题讨论】:

  • 你的意思是让 JSON 字符串自动解码成 JavaScript 对象吗?
  • 根据我上面评论中的链接,您希望JSON.parse(text); 将其变成一个对象。
  • @Archer 我不知道 JSON.parse,它似乎确实接近解决方案,但我得到了我无法解析 FileReader obj 的错误......无论如何我可以将信息传递给另一个obj来保存字符串,然后解析那个obj?
  • JSON 是字符串格式。 “解析 FileReader obj” 是什么意思?您能否在问题中包含使用 FileReader 的 HTML 和 JavaScript 代码?见stackoverflow.com/help/mcve

标签: javascript typescript filereader


【解决方案1】:

问题中的代码错误地使用了FileReader

FileReader .readAs<Type> 操作是异步的。 FileReader 具有 loadloadend 事件,其中 event.targetFileReader 实例的 result 属性是生成的异步处理数据。

不要解析 FileReader 对象本身。

.readAs<Type> 期望 Blob 作为参数传递,而不是 JavaScript 普通对象。

const MY_JSON_FILE = [{
  "hello": "world"
}];

let json = JSON.stringify(MY_JSON_FILE);

const blob = new Blob([json], {type:"application/json"});

const fr = new FileReader();

fr.addEventListener("load", e => {
  console.log(e.target.result, JSON.parse(fr.result))
});

fr.readAsText(blob);

【讨论】:

  • 这很有意义,并且似乎是正确的答案,但我在控制台上收到一条错误消息,提示“类型 'EventTarget' 上不存在属性 'result'”。 log 和使用的 .result ......知道为什么吗?
  • 我似乎无法...错误可能在我这边,我会仔细看看。我对这一切有点陌生,很抱歉没有尽可能清楚!
  • 只是突然出现一个简短的提示,即“将其关闭再打开”的良好旧 IT 修复程序可以“修复”正在发生的任何错误。它现在正在工作!再次感谢您!
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2017-12-01
  • 2014-01-18
  • 2020-09-21
相关资源
最近更新 更多