当前位置: 首页 > 知识库问答 >
问题:

如何正确写入json文件?

壤驷茂实
2023-03-14

我存储用户收藏夹到json文件,但我得到以下错误:

未处理的异常:类型“\u InternalLinkedHashMap”

我将以下数据添加到文件中:

{
 3423: {
'ID': 3423,
'Title': 'Jupiter Ascending',
'Image': 'https://...'
}
}

代码是:

File jsonFile;
Directory dir;
String fileName = "Reading.json";
bool fileExists = false;
List<Map> fileContent;

@override
void initState() {
  super.initState();
  /*to store files temporary we use getTemporaryDirectory() but we need
    permanent storage so we use getApplicationDocumentsDirectory() */
  getApplicationDocumentsDirectory().then((Directory directory) {
    dir = directory;
    jsonFile = new File(dir.path + "/" + fileName);
    fileExists = jsonFile.existsSync();
    if (fileExists)
      this.setState(
          () => fileContent = json.decode(jsonFile.readAsStringSync()));
  });
}

void createFile(Map content, Directory dir, String fileName) {
  print("Creating file!");
  File file = new File(dir.path + "/" + fileName);
  file.createSync();
  fileExists = true;
  file.writeAsStringSync(json.encode(content));
}

void writeToFile(var key, var value) {
  print("Writing to file!");
  Map content = {key: value};
  if (fileExists) {
    print("File exists");
    Map jsonFileContent = json.decode(jsonFile.readAsStringSync());
    jsonFileContent.addAll(content);
    jsonFile.writeAsStringSync(json.encode(jsonFileContent));
  } else {
    print("File does not exist!");
    createFile(content, dir, fileName);
  }
  this.setState(() => fileContent = json.decode(jsonFile.readAsStringSync()));
  print(fileContent);
}

我很困惑,不知道如何解决这个问题。

共有1个答案

安经纶
2023-03-14

您已经删除了您的WriteToFile方法中的任何键入痕迹,这使得Dart无法帮助您。问题来自:

void writeToFile(var key, var value) {
  print("Writing to file!");
  Map content = {key: value};
...

首先,永远不要将var用作方法的参数类型。这真的很糟糕,因为你允许所有的类型都不是你想要的。

在本例中,json的结果。解码(jsonFile.readAsStringSync())将是一个映射

但是您使用Map Content={key: value};创建的Map类型将是Map

因为你不能把Map的内容

您可以做的是将键至少设置为如下字符串:

void writeToFile(String key, var value) {
  print("Writing to file!");
  final content = {key: value};
...

我还会说,如果您使用的是var最终,而不是尝试手动键入类型,您可以帮助自己。如果您想要类型,这很好,但是您真的需要显式地写入类型的正确泛型部分。

例如,这是错误的:

Map jsonFileContent = json.decode(jsonFile.readAsStringSync());

因为你是在把一般的部分赶走。相反,它应该是:

Map<String, dynamic> jsonFileContent = json.decode(jsonFile.readAsStringSync());

或者让Dart处理这些东西:

final jsonFileContent = json.decode(jsonFile.readAsStringSync());

 类似资料:
  • 问题内容: 我正在Ruby中创建哈希,并希望以正确的格式将其写入JSON文件。 这是我的代码: 这是结果文件的内容: 我正在使用Sinatra(不知道哪个版本)和Ruby v 1.8.7。 如何以正确的JSON格式将其写入文件? 问题答案: 需要JSON库,并使用。 您的temp.json文件现在看起来像:

  • 问题内容: 当我在Python中打开FIFO(命名管道)进行写入时,发生了非常奇怪的事情。考虑一下当我尝试打开FIFO以便在交互式解释器中进行写入时发生的情况: 以上行将阻塞,直到我打开另一个解释器并键入以下内容: 我不明白为什么我必须等待打开管道进行读取,但是让我们跳过它。上面的代码将阻塞,直到有可用的数据为止。但是,假设我回到第一个解释器窗口并输入: 预期的行为是,在第二个解释器上,对的调用将

  • 问题内容: 我在变量中存储了JSON数据。 我想将其写入文本文件进行测试,因此不必每次都从服务器获取数据。 目前,我正在尝试: 我收到此错误: TypeError:必须是字符串或缓冲区,而不是dict 如何解决这个问题? 问题答案: 您忘记了实际的JSON部分- 是字典,尚未进行JSON编码。写这样的最大兼容性(Python 2和3): 在现代系统(即Python 3和UTF-8支持)上,您可以使

  • 问题内容: 我将JSON数据存储在变量中data。 我想将其写入文本文件进行测试,因此不必每次都从服务器获取数据。 目前,我正在尝试: 我收到此错误: 必须是字符串或缓冲区,而不是dict 如何解决? 问题答案: 你忘记了实际的JSON部分- data是字典,尚未进行JSON编码。写这样的最大兼容性(Python 2和3): 在现代系统(即Python 3和UTF-8支持)上,你可以使用

  • 问题内容: 我已经习惯了 但是,似乎已经弃用了。推荐使用哪种方法进行上述操作? 更新:关于…的所有这些答案,”\n”这是通用的还是特定于的?IE,我应该上运行吗? 问题答案: 这应该很简单: 从文档: 写入以文本模式打开的文件时(默认),请勿用作行终止符;在所有平台上都使用一个’\ n’代替。 一些有用的读物​​: with声明 open() ‘a’用于追加或使用 ‘w’截断书写 os(特别是os

  • 问题内容: 我一直在尝试对导入的某些数据使用mongo,但是我无法在我的文档描述中正确使用它。 这是我使用mongoimport导入的.json的示例:https ://gist.github.com/2917854 我注意到,尽管为每个商店都创建了一个对象,但所有文档仍被导入到一个唯一的对象中。 这就是为什么当我尝试寻找商店或任何我想查询的东西时,所有文档都被退回的原因。 我希望能够查询数据库以