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

Dart中jsonEncode编码自定义简单类抛出异常的问题求助

解决Dart自定义类无法JSON序列化的问题

Dart的jsonEncode默认只支持原生可序列化类型(比如String、int、List、Map等),自定义类需要明确告诉编码器如何转换对象结构,下面给两种实用解决办法:

方法一:手动实现toJson方法

这是最简单直接的方式,在自定义类里添加toJson()方法,将对象转为JSON可识别的Map结构:

class TestJsonConversion {
  String testString = "123245abcde";
  // 注意:原变量名testIneger是拼写错误,修正为testInteger
  int testInteger = 1234;

  // 添加toJson方法,把对象转为Map
  Map<String, dynamic> toJson() {
    return {
      'testString': testString,
      'testInteger': testInteger,
    };
  }
}

void main() {
  var testJsonConversion = TestJsonConversion();
  try {
    var testString = jsonEncode(testJsonConversion);
    print(testString);
  } catch(e) {
    print(e.toString());
  }
  runApp(const MyApp());
}

修改后jsonEncode会自动调用toJson()方法,将对象转为Map后完成序列化。

方法二:使用json_annotation自动生成序列化代码

如果自定义类结构复杂,推荐用这个方式减少手动代码量:

  1. 在pubspec.yaml中添加依赖:
dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.8.1

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.4.4
  json_serializable: ^6.7.1
  1. 修改自定义类并添加注解:
import 'package:json_annotation/json_annotation.dart';

// 关联自动生成的代码文件
part 'test_json_conversion.g.dart';

@JsonSerializable()
class TestJsonConversion {
  String testString = "123245abcde";
  int testInteger = 1234;

  TestJsonConversion();

  // 从JSON转对象的工厂方法,由生成代码实现
  factory TestJsonConversion.fromJson(Map<String, dynamic> json) => _$TestJsonConversionFromJson(json);

  // 转JSON的方法,由生成代码实现
  Map<String, dynamic> toJson() => _$TestJsonConversionToJson(this);
}
  1. 在终端执行命令生成序列化代码:
flutter pub run build_runner build

执行后会自动生成test_json_conversion.g.dart文件,里面包含了序列化和反序列化的具体逻辑,此时你的main函数代码就能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:43:26