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自动生成序列化代码
如果自定义类结构复杂,推荐用这个方式减少手动代码量:
- 在
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
- 修改自定义类并添加注解:
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); }
- 在终端执行命令生成序列化代码:
flutter pub run build_runner build
执行后会自动生成test_json_conversion.g.dart文件,里面包含了序列化和反序列化的具体逻辑,此时你的main函数代码就能正常运行。
内容的提问来源于stack exchange,提问作者Wrog
相关产品推荐
相关产品推荐

