You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jsonEncode()将Map转JSON时抛出SharedString编码失败错误

解决jsonEncode序列化SharedString实例失败的问题

报错核心是jsonEncode仅支持JSON原生类型(字符串、数字、布尔、null、List、Map)的序列化,你的finalArJson中包含自定义的SharedString实例,默认编码器无法识别该类型,导致转换失败。以下是三种可行解决方案:

方案1:递归替换Map/List中的SharedString实例

若无法修改SharedString类,可先遍历数据结构,将所有SharedString实例替换为其包含的实际字符串值:

// 递归处理嵌套的Map和List
dynamic normalizeData(dynamic input) {
  if (input is Map) {
    return input.map((k, v) => MapEntry(k, normalizeData(v)));
  } else if (input is List) {
    return input.map(normalizeData).toList();
  } else if (input is SharedString) {
    // 替换为SharedString的实际字符串内容,比如取value属性或调用toString()
    return input.value; // 根据你的SharedString类实际定义调整
  }
  return input;
}

// 先处理数据再编码
String data = jsonEncode(normalizeData(finalArJson));

方案2:给SharedString类添加toJson方法

若有权修改SharedString类,直接添加toJson方法,让jsonEncode自动识别转换规则:

class SharedString {
  final String content; // 假设类中存储字符串的属性为content

  SharedString(this.content);

  // 添加toJson方法,返回可序列化的字符串
  String toJson() {
    return content;
  }
}

添加后直接使用原代码jsonEncode(finalArJson)即可正常序列化。

方案3:使用自定义toEncodable回调

在调用jsonEncode时传入toEncodable参数,指定SharedString的转换逻辑:

String data = jsonEncode(
  finalArJson,
  toEncodable: (obj) {
    if (obj is SharedString) {
      return obj.value; // 替换为实际字符串属性
    }
    // 其他类型保持默认处理逻辑
    return obj;
  },
);

内容的提问来源于stack exchange,提问作者Shanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:15