Flutter中如何使用json_annotation处理JSON数据

我在Flutter项目中需要处理复杂的JSON数据,听说json_annotation这个库很好用,但不太清楚具体如何配置和使用。能否详细说明以下步骤:

  1. 如何添加json_serializable和json_annotation依赖?
  2. 如何用@JsonSerializable标注模型类?
  3. 自动生成.g.dart文件的具体命令是什么?
  4. 遇到"Target of URI doesn’t exist"错误该如何解决?
  5. 如何处理嵌套的JSON对象和数组?
2 回复

在Flutter中使用json_annotation处理JSON数据,需以下步骤:

  1. 添加依赖:json_annotationbuild_runnerjson_serializable
  2. 创建模型类,使用@JsonSerializable注解。
  3. 运行flutter pub run build_runner build生成序列化代码。
  4. 使用fromJsontoJson方法转换数据。

示例:

@JsonSerializable()
class User {
  final String name;
  User(this.name);
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

更多关于Flutter中如何使用json_annotation处理JSON数据的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用json_annotation处理JSON数据,可以简化序列化和反序列化过程。以下是详细步骤:

1. 添加依赖

pubspec.yaml文件中添加:

dependencies:
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.1

2. 创建数据模型类

使用@JsonSerializable注解类,并定义fromJsontoJson方法:

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, required this.email});

  // 从JSON映射创建User对象
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 将User对象转换为JSON映射
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

3. 生成代码

运行以下命令生成序列化代码:

flutter pub run build_runner build

或监听文件变化自动生成:

flutter pub run build_runner watch

4. 使用示例

// JSON字符串转对象
Map<String, dynamic> userMap = jsonDecode('{"name": "Alice", "age": 25, "email": "alice@example.com"}');
User user = User.fromJson(userMap);

// 对象转JSON字符串
String jsonString = jsonEncode(user.toJson());

5. 高级配置

  • 字段别名:使用@JsonKey(name: 'user_name')映射不同JSON键名。
  • 忽略字段:添加ignore: true@JsonKey
  • 自定义转换:通过fromJsontoJson参数实现。

注意事项

  • 确保类字段为public(非以下划线开头)。
  • 每次修改模型类后需重新生成代码。
  • 支持嵌套对象和列表的自动处理。

这种方法减少了手动编写序列化代码的工作量,提高开发效率并降低错误率。

回到顶部