Flutter JSON转Dart模型插件json_to_dart_generator的使用

Flutter JSON转Dart模型插件json_to_dart_generator的使用

1. 使用此包作为库

首先,在pubspec.yaml文件中添加json_to_dart_generator到依赖项中。

dependencies:
  flutter:
    sdk: flutter
  json_to_dart_generator: any

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.0.0
  json_to_dart_generator: any

然后在你的Dart文件中导入json_to_dart_generator包:

import 'package:json_to_dart_generator/json_to_dart_generator.dart';

2. 支持类

1. 创建一个名为school.dart的Dart文件
import 'dart:convert';

import 'package:json_to_dart_generator/json_to_dart_generator.dart';

part 'school.g.dart';

@JsonObject(copyWith: true)
class School {
  final String schoolName;
  final List<Grade>? gradeList;

  School({required this.schoolName, this.gradeList});

  factory School.fromJson(Map<String, dynamic> json) => _$SchoolFromJson(json);
  Map<String, dynamic> toJson() => _$SchoolToJson(this);
}

@JsonObject(toJsonString: true)
class Grade {
  String gradeName;

  Grade({required this.gradeName});

  factory Grade.fromJson(Map<String, dynamic> json) => _$GradeFromJson(json);

  Map<String, dynamic> toJson() => _$GradeToJson(this);

  Grade copyWith({String? gradeName}) => _$GradeCopyWith(this, gradeName: gradeName);
}
2. 运行生成器

在终端中运行以下命令以生成school.g.dart文件:

flutter pub run build_runner build
3. 生成school.g.dart

生成的文件内容如下:

// GENERATED CODE - DO NOT MODIFY BY HAND

// **************************************************************************
// JsonToDartGenerator
// **************************************************************************

part of 'school.dart';

School _$SchoolFromJson(Map<String, dynamic> json) => School(
      schoolName: json['schoolName']?.toString() ?? '',
      gradeList: json['gradeList'] != null
          ? DecodeHelper.toList<Map>(json['gradeList'])
              .map((e) => Grade.fromJson(Map<String, dynamic>.from(e)))
              .toList()
          : null,
    );

Map<String, dynamic> _$SchoolToJson(School school) {
  return {
    'schoolName': school.schoolName,
    'gradeList': school.gradeList?.cast<Grade>(),
  };
}

School _$SchoolCopyWith(
  School school, {
  String? schoolName,
  List<Grade>? gradeList,
}) {
  return School(
    schoolName: schoolName ?? school.schoolName,
    gradeList: gradeList ?? school.gradeList,
  );
}

Grade _$GradeFromJson(Map<String, dynamic> json) => Grade(
      gradeName: json['gradeName']?.toString() ?? '',
    );

Map<String, dynamic> _$GradeToJson(Grade grade) {
  return {
    'gradeName': grade.gradeName,
  };
}

Grade _$GradeCopyWith(
  Grade grade, {
  String? gradeName,
}) {
  return Grade(
    gradeName: gradeName ?? grade.gradeName,
  );
}

String _$GradeToJsonString(Grade grade) {
  return json.encode(_$GradeToJson(grade));
}

3. 支持枚举

1. 创建一个名为gender.dart的Dart文件
import 'dart:convert';

import 'package:json_to_dart_generator/json_to_dart_generator.dart';

part 'gender.enum.dart';

@JsonEnum()
enum Gender {
  @EnumValue('1', text: '女', code: 101)
  female,
  @EnumValue('2', text: '男', code: 201)
  male,
  @EnumValue('0', text: '未知', code: 301)
  none,
}

extension GenderValues on Gender {
  String get text => _$getTextForGender(this)!;

  String get value => _$getValueForGender(this)!;
}
2. 运行生成器

再次在终端中运行以下命令以生成gender.enum.dart文件:

flutter pub run build_runner build
3. 生成gender.enum.dart

生成的文件内容如下:

// GENERATED CODE - DO NOT MODIFY BY HAND

// **************************************************************************
// JsonEnumGenerator
// **************************************************************************

part of 'gender.dart';

// **************************************************************************
// Gender
// **************************************************************************

const _$GenderEnumMap = {
  '1': {'enum': Gender.female, 'text': '女', 'code': 101},
  '2': {'enum': Gender.male, 'text': '男', 'code': 201},
  '0': {'enum': Gender.none, 'text': '未知', 'code': 301},
};

String? _$getTextForGender(Gender that) {
  for (dynamic key in _$GenderEnumMap.keys) {
    Map<String, dynamic> enumInfo = _$GenderEnumMap[key]!;
    if (enumInfo['enum'] == that) {
      return enumInfo['text'];
    }
  }
  return null;
}

int? _$getCodeForGender(Gender that) {
  for (dynamic key in _$GenderEnumMap.keys) {
    Map<String, dynamic> enumInfo = _$GenderEnumMap[key]!;
    if (enumInfo['enum'] == that) {
      return enumInfo['code'];
    }
  }
  return null;
}

dynamic _$getValueForGender(Gender that) {
  for (dynamic key in _$GenderEnumMap.keys) {
    Map<String, dynamic> enumInfo = _$GenderEnumMap[key]!;
    if (enumInfo['enum'] == that) {
      return key;
    }
  }
  return null;
}

Gender _$getGenderWithNonnull(dynamic value, {required Object defaultValue}) {
  assert(value is String || value is int);
  assert(defaultValue is String || defaultValue is int);
  final enumInfo = _$GenderEnumMap[value] ?? _$GenderEnumMap[defaultValue];
  assert(enumInfo != null);
  return enumInfo!['enum'] as Gender;
}

Gender? _$getGender(dynamic value, {Object? defaultValue}) {
  assert(value is String || value is int);
  var enumInfo = _$GenderEnumMap[value];
  if (enumInfo == null && defaultValue != null) {
    assert(defaultValue is String || defaultValue is int);
    enumInfo = _$GenderEnumMap[defaultValue];
  }
  return enumInfo?['enum'] as Gender?;
}

更多关于Flutter JSON转Dart模型插件json_to_dart_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON转Dart模型插件json_to_dart_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


json_to_dart_generator 是一个用于在 Flutter 中自动生成 Dart 数据模型类的插件。它可以帮助你快速将 JSON 数据转换为 Dart 类,从而简化处理 JSON 数据的过程。

安装 json_to_dart_generator

首先,你需要在 pubspec.yaml 文件中添加 json_to_dart_generatorbuild_runner 作为开发依赖:

dev_dependencies:
  build_runner: ^2.1.0
  json_to_dart_generator: ^1.1.0

然后运行 flutter pub get 来安装依赖。

使用 json_to_dart_generator

  1. 创建 JSON 文件:首先,你需要有一个包含 JSON 数据的文件。例如,data.json
{
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com",
  "isActive": true
}
  1. 创建 Dart 文件:在你的 Flutter 项目中创建一个 Dart 文件,例如 user_model.dart,并添加以下代码:
import 'package:json_annotation/json_annotation.dart';

part 'user_model.g.dart';

@JsonSerializable()
class UserModel {
  final String name;
  final int age;
  final String email;
  final bool isActive;

  UserModel({
    required this.name,
    required this.age,
    required this.email,
    required this.isActive,
  });

  factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);

  Map<String, dynamic> toJson() => _$UserModelToJson(this);
}
  1. 生成 Dart 模型类:运行以下命令来生成模型类:
flutter pub run build_runner build

这将会生成 user_model.g.dart 文件,其中包含了自动生成的 fromJsontoJson 方法。

  1. 使用生成的类:现在你可以在你的 Flutter 项目中使用生成的 UserModel 类了。例如:
import 'dart:convert';
import 'user_model.dart';

void main() {
  final jsonString = '''
  {
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com",
    "isActive": true
  }
  ''';

  final jsonMap = jsonDecode(jsonString);
  final user = UserModel.fromJson(jsonMap);

  print('Name: ${user.name}');
  print('Age: ${user.age}');
  print('Email: ${user.email}');
  print('Is Active: ${user.isActive}');

  final userJson = user.toJson();
  print('User JSON: $userJson');
}
回到顶部