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

解码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:43