使用jsonEncode()将Map转JSON时抛出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
相关产品推荐
相关产品推荐

