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

在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#的自动序列化,通过代码生成工具实现映射逻辑,步骤如下:

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

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.1
  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);
}
  1. 运行代码生成命令:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:25