flutter json转换示例
时间: 2025-06-02 16:27:01 浏览: 17
### JSON 转换在 Flutter 中的应用
以下是关于如何在 Flutter 中实现 JSON 转换的一个完整示例代码:
#### 定义数据模型并启用 `json_serializable`
为了简化 JSON 和 Dart 对象之间的转换过程,推荐使用 `json_serializable` 包来生成序列化/反序列化的代码。
```dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart'; // 自动生成的部分
@JsonSerializable()
class User {
@JsonKey(name: 'user-name') // 将 JSON 键映射到 Dart 字段
String? name;
int? age;
User({this.name, this.age});
/// 反序列化工厂方法
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
/// 序列化方法
Map<String, dynamic> toJson() => _$UserToJson(this);
}
```
此部分定义了一个简单的 `User` 类,并利用了 `@JsonSerializable()` 注解以及 `@JsonKey` 来支持自定义键名映射[^3]。
---
#### 主函数中的 JSON 解析与编码
以下是一个完整的解析和编码流程演示:
```dart
import 'dart:convert';
import 'package:flutter/material.dart';
import './user.dart'; // 导入上面的数据模型文件
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () async {
_processJson();
},
child: Text('Process JSON'),
),
),
),
);
}
}
Future<void> _processJson() async {
// 示例 JSON 数据字符串
String jsonString =
'{"user-name": "Alice", "age": 28}';
// 解码 JSON 到 Map
Map<String, dynamic> userMap = json.decode(jsonString);
// 创建对象实例
var user = User.fromJson(userMap);
print('Name: ${user.name}, Age: ${user.age}');
// 编码回 JSON 字符串
String encodedJson = json.encode(user.toJson());
print('Encoded JSON: $encodedJson');
}
```
在此代码中展示了如何将 JSON 字符串转化为 Dart 对象,再将其重新编码为 JSON 字符串的过程[^1]。
---
#### 如何生成 `.g.dart` 文件?
为了让上述代码正常工作,需要确保已安装依赖项 `build_runner` 并执行命令以生成辅助代码文件。具体操作如下:
```bash
flutter pub get
flutter pub run build_runner build --delete-conflicting-outputs
```
这一步骤会基于您的数据模型类生成对应的 `_$.g.dart` 文件,其中包含了 `fromJson` 和 `toJson` 方法的具体实现逻辑[^5]。
---
#### 高级功能:自定义转换器
当遇到更复杂的场景时(例如日期时间字段或其他特定类型的处理),可以通过创建自定义的 `JsonConverter` 来解决这些问题。例如:
```dart
import 'package:json_annotation/json_annotation.dart';
// 自定义转换器用于 DateTime 类型
class DateTimeConverter implements JsonConverter<DateTime, String> {
const DateTimeConverter();
@override
DateTime fromJson(String json) =>
DateTime.parse(json).toLocal(); // 根据需求调整格式
@override
String toJson(DateTime object) => object.toIso8601String();
}
@JsonSerializable(converters: [DateTimeConverter()])
class Event {
final DateTime date;
Event({required this.date});
factory Event.fromJson(Map<String, dynamic> json) => _$EventFromJson(json);
Map<String, dynamic> toJson() => _$EventToJson(this);
}
```
这里展示的是针对 `DateTime` 类型的自定义转换机制[^4]。
---
### 总结
以上内容涵盖了从基础到高级的各种 JSON 转换技巧,包括但不限于手动编写、工具自动化生成以及应对复杂情况下的解决方案。
阅读全文
相关推荐


















