Flutter如何实现JSON数据转换

在Flutter项目中,如何将JSON数据转换为Dart对象?目前我在处理API返回的JSON数据时遇到了困难,不知道是该手动编写模型类还是用工具自动生成。有没有推荐的高效转换方法或第三方库?最好能说明如何处理嵌套JSON结构和类型安全的问题。

2 回复

Flutter中可使用dart:convert库的json.decode()将JSON字符串转为对象,json.encode()将对象转为JSON字符串。推荐使用json_serializable包自动生成序列化代码,简化处理。

更多关于Flutter如何实现JSON数据转换的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现JSON数据转换主要有以下几种方式:

1. 手动序列化(基础方法)

使用 dart:convert 库进行手动转换:

import 'dart:convert';

// JSON字符串转Map
String jsonString = '{"name": "John", "age": 30}';
Map<String, dynamic> userMap = jsonDecode(jsonString);

// Map转JSON字符串
Map<String, dynamic> user = {'name': 'Alice', 'age': 25};
String json = jsonEncode(user);

2. 使用模型类(推荐)

创建数据模型类,实现序列化方法:

class User {
  final String name;
  final int age;

  User({required this.name, required this.age});

  // JSON转对象
  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      name: json['name'],
      age: json['age'],
    );
  }

  // 对象转JSON
  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
    };
  }
}

// 使用示例
Map<String, dynamic> userMap = jsonDecode(jsonString);
User user = User.fromJson(userMap);

String json = jsonEncode(user.toJson());

3. 使用代码生成工具(最佳实践)

安装依赖:

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;

  User({required this.name, required this.age});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

生成代码:

flutter pub run build_runner build

4. 处理复杂JSON

对于嵌套结构:

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

@JsonSerializable()
class Address {
  final String street;
  final String city;
  
  Address({required this.street, required this.city});
  
  factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);
  Map<String, dynamic> toJson() => _$AddressToJson(this);
}

推荐使用代码生成方式,因为它提供了类型安全、自动完成和编译时错误检查,大大减少了手动编码的错误。

回到顶部