【问题标题】:How to write to json files correctly?如何正确写入 json 文件?
【发布时间】:2020-11-08 19:01:11
【问题描述】:

我将用户收藏夹存储到 json 文件中,但出现以下错误:

未处理的异常:类型“_InternalLinkedHashMap”不是“other”的“Map”类型的子类型

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

{
 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);
}

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

【问题讨论】:

    标签: json flutter dart


    【解决方案1】:

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

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

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

    在这种情况下,json.decode(jsonFile.readAsStringSync()) 的结果将是运行时的 Map&lt;String, dynamic&gt; 实例。

    但是您使用 Map content = {key: value}; 创建的 Map 将属于 Map&lt;dynamic, dynamic&gt; 类型,因为它在编译代码时无法预测键和值的类型。

    由于您无法将Map&lt;dynamic, dynamic&gt; 的内容放入Map&lt;String, dynamic&gt;,因此会出现错误。

    您可以做的是使key 至少是一个字符串,例如:

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

    我还要说,如果您使用 varfinal 而不是尝试手动输入类型,那么您可以帮助自己。如果您需要类型,那很好,但您确实需要显式编写类型的正确泛型部分。

    例如这是错误的:

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

    因为您将通用部分排除在外。相反,它应该是:

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

    或者让 Dart 处理这些东西:

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

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2020-10-23
      • 2016-05-24
      • 2020-07-01
      • 2022-06-29
      相关资源
      最近更新 更多