在Dart中无法实现C#式JSON映射,求教JSON与Map的区别
Dart中JSON与Map的差异及JSON映射实现
一、JSON与Map的核心差异
- JSON:是一种文本格式,本质是遵循特定语法的字符串(键必须用双引号、值仅支持字符串/数字/布尔/数组/对象/null等类型),主要用于跨平台数据传输或持久化存储。
- Map:是Dart内置的内存数据结构,是键值对集合,键可以是任意不可变类型(如String、int),值可以是任意Dart对象,是代码运行时直接操作的数据载体。
- 转换逻辑:JSON字符串需通过
jsonDecode()解析为Map/List才能在Dart中操作;Map/List需通过jsonEncode()序列化为JSON字符串,才能用于存储或传输。
二、Dart中实现类似C#的JSON映射逻辑
C#常用Newtonsoft.Json或System.Text.Json实现对象与JSON的自动映射,Dart中有等价的实现方案:
1. 手动映射(简单场景)
适合结构简单的实体类,手动实现Map与实体的转换:
class User { final String name; final int age; User({required this.name, required this.age}); // 从Map转实体 User.fromJson(Map<String, dynamic> json) : name = json['name'], age = json['age']; // 从实体转Map(兼容JSON序列化和SQFLite存储) Map<String, dynamic> toJson() => { 'name': name, 'age': age, }; } // 示例用法 void main() { // JSON字符串解析为Map final jsonStr = '{"name":"Alice","age":25}'; final userMap = jsonDecode(jsonStr); // Map转实体对象 final user = User.fromJson(userMap); // 实体转Map再序列化为JSON字符串 final newJsonStr = jsonEncode(user.toJson()); }
2. 用json_serializable实现自动映射(复杂场景)
类似C#的自动序列化,通过代码生成工具实现映射逻辑,步骤如下:
- 在
pubspec.yaml添加依赖:
dependencies: json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.1
- 定义带注解的实体类:
import 'package:json_annotation/json_annotation.dart'; // 自动生成的代码文件 part 'user.g.dart'; @JsonSerializable() class User { final String name; final int age; final String? email; // 可选字段 User({required this.name, required this.age, this.email}); // 自动生成的fromJson方法 factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); // 自动生成的toJson方法 Map<String, dynamic> toJson() => _$UserToJson(this); }
- 运行代码生成命令:
dart pub run build_runner build
执行后会自动生成user.g.dart文件,包含序列化/反序列化的实现代码,用法与手动映射一致。
3. 与SQFLite的配合
SQFLite存储数据时仅支持Map<String, dynamic>格式,实体类的toJson()方法可直接将对象转为SQFLite可存储的Map;从SQFLite查询得到的Map,也可通过fromJson()转为实体:
// 存储对象到SQFLite await db.insert('users', user.toJson()); // 从SQFLite查询并转为实体列表 final maps = await db.query('users'); final users = maps.map((map) => User.fromJson(map)).toList();
内容的提问来源于stack exchange,提问作者Davut Aslan
相关产品推荐
相关产品推荐

