Flutter教程JSON数据解析与生成
在Flutter开发中,如何正确解析和生成JSON数据?使用内置的dart:convert库时,遇到复杂嵌套结构总是报类型转换错误,有没有更高效的解决方案?另外,看到有人推荐json_serializable,这个第三方库的实际使用体验如何?是否需要手动编写模型类,有没有自动化工具能减少样板代码?对于API返回的动态JSON字段(比如某些字段可能为null或不同类型),最佳处理方式是什么?
以下是一个简单的Flutter教程,教你如何进行JSON数据解析和生成。
-
JSON数据解析
假设我们有如下JSON字符串:{"name": "张三", "age": 25}
使用
dart:convert
库中的jsonDecode
方法解析:import 'dart:convert'; void main() { String jsonString = '{"name": "张三", "age": 25}'; Map<String, dynamic> data = jsonDecode(jsonString); print(data['name']); // 输出:张三 }
-
从JSON生成对象
创建一个模型类Person
:class Person { String name; int age; Person({required this.name, required this.age}); factory Person.fromJson(Map<String, dynamic> json) { return Person(name: json['name'], age: json['age']); } }
解析时使用工厂构造函数:
void main() { String jsonString = '{"name": "李四", "age": 30}'; Person person = Person.fromJson(jsonDecode(jsonString)); print(person.name); // 输出:李四 }
-
JSON数据生成
如果要将对象转换为JSON:void main() { Person person = Person(name: "王五", age: 40); Map<String, dynamic> jsonData = { 'name': person.name, 'age': person.age, }; String jsonString = jsonEncode(jsonData); print(jsonString); // 输出:{"name":"王五","age":40} }
以上是基本的Flutter JSON解析和生成示例。
更多关于Flutter教程JSON数据解析与生成的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
要实现Flutter中的JSON数据解析与生成,首先确保你已安装了Flutter和Dart环境。
-
JSON生成:使用Dart的
jsonEncode()
函数。例如:Map<String, dynamic> user = {'name': 'Tom', 'age': 25}; String jsonStr = jsonEncode(user); print(jsonStr); // 输出: {"name":"Tom","age":25}
-
JSON解析:使用
jsonDecode()
函数。例如:String jsonString = '{"name":"Jerry","age":20}'; Map<String, dynamic> data = jsonDecode(jsonString); print(data['name']); // 输出: Jerry
-
自定义对象解析:创建一个类并添加从JSON到对象的构造方法。例如:
class User { String name; int age; User({required this.name, required this.age}); factory User.fromJson(Map<String, dynamic> json) { return User(name: json['name'], age: json['age']); } Map<String, dynamic> toJson() => {'name': name, 'age': age}; } // 使用 String jsonInput = '{"name":"Spike","age":30}'; User user = User.fromJson(jsonDecode(jsonInput)); print(user.name); // 输出: Spike
这是基本的JSON操作流程,适用于Flutter应用的数据交互。
Flutter JSON数据解析与生成教程
在Flutter中处理JSON数据是常见的需求,以下是基本方法:
1. JSON解析(反序列化)
手动解析
// 示例JSON数据
String jsonString = '{"name": "John", "age": 30}';
// 解析为Map
Map<String, dynamic> user = jsonDecode(jsonString);
print(user['name']); // 输出: John
print(user['age']); // 输出: 30
使用模型类
class User {
final String name;
final int age;
User({required this.name, required this.age});
factory User.fromJson(Map<String, dynamic> json) {
return User(
name: json['name'],
age: json['age'],
);
}
}
// 使用
User user = User.fromJson(jsonDecode(jsonString));
2. JSON生成(序列化)
手动生成
Map<String, dynamic> userMap = {
'name': 'John',
'age': 30
};
String jsonStr = jsonEncode(userMap);
使用模型类
class User {
// ...同上...
Map<String, dynamic> toJson() => {
'name': name,
'age': age,
};
}
// 使用
String jsonStr = jsonEncode(user.toJson());
3. 使用json_serializable包(推荐)
- 添加依赖:
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
对于嵌套JSON:
@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);
}
@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);
}
记得在pubspec.yaml中添加dart:convert
的依赖。