解码Redux生成的JSON时遇Unexpected Character错误,求修复方案
解决Dart解析Redux生成JSON时的FormatException问题
我来帮你搞定这个解析错误!你遇到的FormatException: Unexpected character本质是JSON解析的逻辑错配,结合你的代码和错误提示,咱们一步步排查:
先看你代码里的核心问题
你的fromJson方法里,对json["todos"]和json['visibilityFilter']直接调用了codec.decode()——这大概率是错误的,因为:
- 如果传入的
json参数已经是解析后的Map对象,那json["todos"]是List类型,codec.decode()会把它的字符串形式(比如[Instance of 'Todo'])当成JSON去解析,这显然不是标准JSON,直接触发格式错误。 - 如果传入的
json是原始JSON字符串,那你第一步应该先解析整个字符串成Map,而不是直接取json["todos"](字符串根本没有下标操作)。
针对两种场景的修正方案
场景1:fromJson接收的是原始JSON字符串
如果Redux传给你的是JSON字符串,先把整个字符串解析成Map,再逐个处理字段:
static TodoState fromJson(String jsonStr) { // 先解析整个JSON字符串为Map final jsonMap = JsonCodec().decode(jsonStr); // 把todos数组转换为List<Todo>(需要Todo类实现fromJson方法) final todos = (jsonMap["todos"] as List) .map((todoJson) => Todo.fromJson(todoJson)) .toList(); // 处理VisibilityFilter枚举:根据JSON里的字符串匹配枚举值 final filter = VisibilityFilter.values.firstWhere( (v) => v.name == jsonMap['visibilityFilter'], orElse: () => VisibilityFilter.all, // 默认值 ); return TodoState(todos: todos, visibilityFilter: filter); }
场景2:fromJson接收的是已经解析好的Map
如果Redux已经帮你把JSON解析成了Map<String, dynamic>,那直接取值转换即可,不需要再调用decode():
static TodoState fromJson(Map<String, dynamic> json) { // 转换todos数组 final todos = (json["todos"] as List) .map((todoJson) => Todo.fromJson(todoJson)) .toList(); // 处理枚举:如果JSON存的是枚举名称(比如"all")用name匹配,如果是索引用values[索引] final filter = VisibilityFilter.values.firstWhere( (v) => v.name == json['visibilityFilter'], orElse: () => VisibilityFilter.all, ); return TodoState(todos: todos, visibilityFilter: filter); }
额外检查点:Redux生成的JSON格式
确保Redux输出的是标准JSON,比如:
{ "todos": [{"id": 1, "text": "Buy milk", "completed": false}], "visibilityFilter": "all" }
如果visibilityFilter存的是枚举的数字索引(比如0),那把枚举转换代码改成VisibilityFilter.values[json['visibilityFilter']]即可。
内容的提问来源于stack exchange,提问作者Mauricio De armas
相关产品推荐
相关产品推荐

