【问题标题】:Dart/Flutter : Avoid Method parsing in Map , when converting to JSON?Dart/Flutter:在转换为 JSON 时避免 Map 中的方法解析?
【发布时间】:2022-02-02 05:27:52
【问题描述】:

在 Dart / Flutter 中,使用 jsonEncode 将地图(包含 Closure 方法)转换为 json 时,出现以下错误:

Converting object to an encodable object failed: Closure: () => dynamic

地图有:

orderedMap1["fooddelete"] = () => deleteItemFunction(
          singleitem["orderId"], singleitem["id"], singleitem["shopId"]);

如果在上面注释,则 jsonEncode 有效,否则抛出错误。

在解析 Map 为 Json 时如何指示 jsonEncode 跳过闭包?

【问题讨论】:

  • 为什么将闭包存储在Map 中?如果您不希望 jsonEncode 对整个 Map 进行编码,则需要先删除不需要的元素或创建一个仅包含所需元素的副本。

标签: json flutter dart hashmap closures


【解决方案1】:

将闭包存储在您要编码为 JSON 的同一 Map 中似乎非常值得怀疑,但如果必须,您可以对它的过滤副本进行编码:

var encoded = jsonEncode({
  for (var entry in orderedMap1.entries)
    if (entry.value is! Function) entry.key: entry.value,
});

我想您也可以使用jsonEncodetoEncodable 参数将闭包转换为其他东西,尽管我不确定这对您有什么好处,因为接收者无能为力。以下将用null 替换闭包:

var encoded = jsonEncode(orderedMap, toEncodable: (value) {
  if (value is Function) {
    return null;
  }
  throw UnsupportedError('Cannot convert to JSON: $value');
});

【讨论】:

    【解决方案2】:

    选项1:使用orderedMap1.remove("fooddelete") 删除“fooddelete”键,然后对其进行解析。

    选项2:将您的闭包放在双引号内。所以你可以把它保存为字符串。

    【讨论】:

    • 选项 2:==> 如果我把它作为一个字符串,那么我如何能够在需要时执行该函数?
    • 如您所知,要在应用程序中传递数据,您必须使用类。该类可以具有任何属性。您可以设置其中之一来保存您的功能。并在任何你想要的地方使用它。你的班级也有一个 toJson。您可以自定义生成的 JSON 中应包含哪些属性。当你使用 toJson 时,这意味着你想将数据传递给服务器或其他东西。不在您的应用程序的其他地方。所以回顾一下,如果你想执行这个函数,那么你在你的应用程序中传递数据,你应该使用类而不是 JSON。
    猜你喜欢
    • 2022-01-08
    • 2020-11-25
    • 2020-02-14
    • 2021-05-17
    • 2020-02-05
    • 2021-02-09
    • 1970-01-01
    • 2021-03-17
    • 2020-12-31
    相关资源
    最近更新 更多