将JSON转成POJO(Object)类似于Flutter中的android
Convert JSON into POJO (Object) similar to android in Flutter
我只是想找到一种方法将 json 响应(来自 REST API)转换为 POJO(在 android 中使用)以便我可以使用接收到的数据进入我的应用程序,因为使用 Map 是不够的,因为我接收的数据有点复杂并且包含 3 个级别的数组(数组内部的数组内部数组)。
我正在使用 Dio 库进行 api 调用,我可以成功进行 API 调用并在控制台上打印数据,完全没有问题。谁能帮我实现这个目标?
以下是我收到的回复。
{
"status": 200,
"message": "success",
"data": [
{
"menu": {
"megamenu_id": "55",
"language_id": "1",
"title": "Mobiles",
"description": "",
"submenu": [
{
"0": {
"info": {
"megamenu_id": "67",
"language_id": "1",
"title": "Mobile Phones",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "68",
"language_id": "1",
"title": "Android Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "69",
"language_id": "1",
"title": "Smart Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "70",
"language_id": "1",
"title": "Windows Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "72",
"language_id": "1",
"title": "Basic Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "73",
"language_id": "1",
"title": "Latest Mobiles",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "74",
"language_id": "1",
"title": "Upcoming Mobiles",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "75",
"language_id": "1",
"title": "Brands",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "76",
"language_id": "1",
"title": "Samsung",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "77",
"language_id": "1",
"title": "Apple",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "78",
"language_id": "1",
"title": "Redmi",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "79",
"language_id": "1",
"title": "Nokia",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "81",
"language_id": "1",
"title": "Sony",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "82",
"language_id": "1",
"title": "Micromax",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "83",
"language_id": "1",
"title": "HTC",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "84",
"language_id": "1",
"title": "Motorola",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "85",
"language_id": "1",
"title": "Oppo",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "86",
"language_id": "1",
"title": "Vivo",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "87",
"language_id": "1",
"title": "Honor",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "88",
"language_id": "1",
"title": "Oneplus",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "94",
"language_id": "1",
"title": "Mobile Accessories",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "95",
"language_id": "1",
"title": "Bluetooth Headsets",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "96",
"language_id": "1",
"title": "Mobile Chargers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "97",
"language_id": "1",
"title": "Mobiles Cases & Covers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "98",
"language_id": "1",
"title": "Screen Protector",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "99",
"language_id": "1",
"title": "Mobile Batteries",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "100",
"language_id": "1",
"title": "Headphones & Headsets",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "101",
"language_id": "1",
"title": "Memory Cards",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "102",
"language_id": "1",
"title": "Power Banks",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "103",
"language_id": "1",
"title": "Stylus",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "104",
"language_id": "1",
"title": "Mobile Docks",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "107",
"language_id": "1",
"title": "Features",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "108",
"language_id": "1",
"title": "Dual Sim Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "111",
"language_id": "1",
"title": "4GB Ram Mobiles",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "112",
"language_id": "1",
"title": "Rear Camera [13 MP]",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "113",
"language_id": "1",
"title": "Screen Size [4.5 - 5.2 Inch]",
"description": ""
}
}
]
}
]
}
},
{
"menu": {
"megamenu_id": "168",
"language_id": "1",
"title": "Fashion",
"description": "",
"submenu": [
{
"0": {
"info": {
"megamenu_id": "169",
"language_id": "1",
"title": "Clothing",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "170",
"language_id": "1",
"title": "T-Shirts",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "171",
"language_id": "1",
"title": "Shirts",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "178",
"language_id": "1",
"title": "Womens Clothing",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "187",
"language_id": "1",
"title": "Night Wear",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "188",
"language_id": "1",
"title": "Tunics",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "189",
"language_id": "1",
"title": "Kurtis",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "190",
"language_id": "1",
"title": "Sarees",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "191",
"language_id": "1",
"title": "Lehengas",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "192",
"language_id": "1",
"title": "Swimming Suit",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "193",
"language_id": "1",
"title": "Men's Footwear",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "194",
"language_id": "1",
"title": "Shoes",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "195",
"language_id": "1",
"title": "Sneakers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "196",
"language_id": "1",
"title": "Sandals & Floaters",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "197",
"language_id": "1",
"title": "Slippers & Flip Flops",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "198",
"language_id": "1",
"title": "Loafers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "199",
"language_id": "1",
"title": "Boots",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "200",
"language_id": "1",
"title": "Shoe Care",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "201",
"language_id": "1",
"title": "Women's Jewellery",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "202",
"language_id": "1",
"title": "Earrings",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "203",
"language_id": "1",
"title": "Bangles",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "204",
"language_id": "1",
"title": "Bracelets",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "205",
"language_id": "1",
"title": "Rings",
"description": ""
}
}
]
}
]
}
},
{
"menu": {
"megamenu_id": "220",
"language_id": "1",
"title": "Care",
"description": ""
}
},
{
"menu": {
"megamenu_id": "221",
"language_id": "1",
"title": "Offers",
"description": ""
}
},
{
"menu": {
"megamenu_id": "222",
"language_id": "1",
"title": "News",
"description": ""
}
}
]
}
这可以使用 built_value 来完成。 link 中提供了详细的文档。
您只需编写一些样板代码和 运行 这个命令 flutter packages pub run build_runner build
。
下面是一个类似于 POJO 的示例class。
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'auth.g.dart';
abstract class Auth implements Built<Auth, AuthBuilder> {
static Serializer<Auth> get serializer => _$authSerializer;
String get currentServerTime;
int get defaultOrganization;
String get tokenExpiryTimeInMs;
bool get rememberMe;
int get failedLoginAttempts;
int get userId;
String get status;
String get token;
Auth._();
factory Auth([updates(AuthBuilder b)]) = _$Auth;
}
下面是序列化器class:
library serializers;
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'auth/auth.dart';
part 'serializers.g.dart';
@SerializersFor(const [
Auth,
])
Serializers serializers = _$serializers;
Serializers standardSerializers =
(serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
下面是从 JSON 到 Object 的转换代码。
Auth auth = standardSerializers.deserializeWith(
Auth.serializer, json.decode(res.body)['user']);
希望这对您有所帮助。
json_serializable 没有很好的文档记录,但它确实可以满足您的需求,比 built_value 更易于使用并且需要更少的样板,尤其是在涉及数组时。
import 'package:json_annotation/json_annotation.dart';
import 'dart:convert';
part 'school.g.dart';
@JsonSerializable()
class School {
final String name;
final int maxStudentCount;
final List<Student> students;
School(this.name, this.maxStudentCount, this.students);
factory School.fromJson(Map<String, dynamic> json) => _$SchoolFromJson(json);
Map<String, dynamic> toJson() => _$SchoolToJson(this);
}
@JsonSerializable()
class Student {
final String name;
final DateTime birthDate;
Student({this.name, this.birthDate});
factory Student.fromJson(Map<String, dynamic> json) => _$StudentFromJson(json);
Map<String, dynamic> toJson() => _$StudentToJson(this);
}
test() {
String jsonString = '''{
"name":"Trump University",
"maxStudentCount":9999,
"students":[
{
"name":"Peter Parker",
"birthDate":"1999-01-01T00:00:00.000Z"
}
]
}''';
final decodedJson = json.decode(jsonString);
final school = School.fromJson(decodedJson);
assert(school.students.length == 1);
}
它还支持枚举序列化。
要生成序列化代码,运行:
flutter packages pub run build_runner build
所以,在对 json_serializable 库进行了一些尝试之后,我想出了自己的解决方案,它根本不需要任何外部库,而且工作起来很有魅力。
这样我就不必编写更少的样板代码,我认为这是一种干净的方法。
模型的制作方法如下
class SideMenuRes {
final int status;
final String message;
final List<SideMenuDatum> sideMenuData;
SideMenuRes({this.status, this.message, this.sideMenuData});
factory SideMenuRes.fromJson(Map json) {
return SideMenuRes(
status: json['status'],
message: json['message'],
sideMenuData: json['status'] == 200 ? (json['data'] as List).map((i) => new
SideMenuDatum.fromJson(i)).toList() : null,
);
}
}
class SideMenuDatum {
final Menu menu;
SideMenuDatum({this.menu});
factory SideMenuDatum.fromJson(Map json) {
return SideMenuDatum(
menu: Menu.fromJson(json['menu']),
);
}
}
class Menu {
final String megamenu_id;
final String language_id;
final String title;
final String description;
final List<SubMenu> subMenu;
Menu({this.megamenu_id, this.language_id, this.title, this.description, this.subMenu});
factory Menu.fromJson(Map json) {
return Menu(
megamenu_id: json['megamenu_id'],
language_id: json['language_id'],
title: json['title'],
description: json['description'],
subMenu: json['submenu'] != null ? (json['submenu'] as List).map((i) => new SubMenu.fromJson(i)).toList() : null
);
}
}
class SubMenu {
final Zero zero;
final List<SubSubMenu> subSubMenu;
SubMenu({this.zero, this.subSubMenu});
factory SubMenu.fromJson(Map json) {
return SubMenu(
zero: Zero.fromJson(json['0']),
subSubMenu: (json['subsubmenu'] as List).map((i) => new SubSubMenu.fromJson(i)).toList()
);
}
}
class Zero {
final Info info;
Zero({this.info});
factory Zero.fromJson(Map json) {
return Zero(
info: Info.fromJson(json['info']),
);
}
}
class SubSubMenu {
final InfoSub infoSub;
SubSubMenu({this.infoSub});
factory SubSubMenu.fromJson(Map json) {
return SubSubMenu(
infoSub: InfoSub.fromJson(json['infosub'])
);
}
}
class InfoSub {
final String megamenu_id;
final String language_id;
final String title;
final String description;
InfoSub({this.megamenu_id, this.language_id, this.title, this.description});
factory InfoSub.fromJson(Map json) {
return InfoSub(
megamenu_id: json['megamenu_id'],
language_id: json['language_id'],
title: json['title'],
description: json['description']
);
}
}
class Info {
final String megamenu_id;
final String language_id;
final String title;
final String description;
Info({this.megamenu_id, this.language_id, this.title, this.description});
factory Info.fromJson(Map json) {
return Info(
megamenu_id: json['megamenu_id'],
language_id: json['language_id'],
title: json['title'],
description: json['description']
);
}
}
然后这样称呼它
SubMenuRes subMenuRes = SubMenuRes.fromJson(response.data);
就是这样!
Android Studio 插件:https://plugins.jetbrains.com/plugin/12562-jsontodart-json-to-dart-
在线: https://app.quicktype.io/?l=dart
手动解析:https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51
从 JSON
生成 Dart classes
将 JSON 转换为 Dart class
从 JSON 或 JSON-Schema 生成 Dart class。
请查看 this post 以获得最适合您目标的选项
我只是想找到一种方法将 json 响应(来自 REST API)转换为 POJO(在 android 中使用)以便我可以使用接收到的数据进入我的应用程序,因为使用 Map 是不够的,因为我接收的数据有点复杂并且包含 3 个级别的数组(数组内部的数组内部数组)。
我正在使用 Dio 库进行 api 调用,我可以成功进行 API 调用并在控制台上打印数据,完全没有问题。谁能帮我实现这个目标?
以下是我收到的回复。
{
"status": 200,
"message": "success",
"data": [
{
"menu": {
"megamenu_id": "55",
"language_id": "1",
"title": "Mobiles",
"description": "",
"submenu": [
{
"0": {
"info": {
"megamenu_id": "67",
"language_id": "1",
"title": "Mobile Phones",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "68",
"language_id": "1",
"title": "Android Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "69",
"language_id": "1",
"title": "Smart Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "70",
"language_id": "1",
"title": "Windows Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "72",
"language_id": "1",
"title": "Basic Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "73",
"language_id": "1",
"title": "Latest Mobiles",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "74",
"language_id": "1",
"title": "Upcoming Mobiles",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "75",
"language_id": "1",
"title": "Brands",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "76",
"language_id": "1",
"title": "Samsung",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "77",
"language_id": "1",
"title": "Apple",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "78",
"language_id": "1",
"title": "Redmi",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "79",
"language_id": "1",
"title": "Nokia",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "81",
"language_id": "1",
"title": "Sony",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "82",
"language_id": "1",
"title": "Micromax",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "83",
"language_id": "1",
"title": "HTC",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "84",
"language_id": "1",
"title": "Motorola",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "85",
"language_id": "1",
"title": "Oppo",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "86",
"language_id": "1",
"title": "Vivo",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "87",
"language_id": "1",
"title": "Honor",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "88",
"language_id": "1",
"title": "Oneplus",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "94",
"language_id": "1",
"title": "Mobile Accessories",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "95",
"language_id": "1",
"title": "Bluetooth Headsets",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "96",
"language_id": "1",
"title": "Mobile Chargers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "97",
"language_id": "1",
"title": "Mobiles Cases & Covers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "98",
"language_id": "1",
"title": "Screen Protector",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "99",
"language_id": "1",
"title": "Mobile Batteries",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "100",
"language_id": "1",
"title": "Headphones & Headsets",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "101",
"language_id": "1",
"title": "Memory Cards",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "102",
"language_id": "1",
"title": "Power Banks",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "103",
"language_id": "1",
"title": "Stylus",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "104",
"language_id": "1",
"title": "Mobile Docks",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "107",
"language_id": "1",
"title": "Features",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "108",
"language_id": "1",
"title": "Dual Sim Phones",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "111",
"language_id": "1",
"title": "4GB Ram Mobiles",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "112",
"language_id": "1",
"title": "Rear Camera [13 MP]",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "113",
"language_id": "1",
"title": "Screen Size [4.5 - 5.2 Inch]",
"description": ""
}
}
]
}
]
}
},
{
"menu": {
"megamenu_id": "168",
"language_id": "1",
"title": "Fashion",
"description": "",
"submenu": [
{
"0": {
"info": {
"megamenu_id": "169",
"language_id": "1",
"title": "Clothing",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "170",
"language_id": "1",
"title": "T-Shirts",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "171",
"language_id": "1",
"title": "Shirts",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "178",
"language_id": "1",
"title": "Womens Clothing",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "187",
"language_id": "1",
"title": "Night Wear",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "188",
"language_id": "1",
"title": "Tunics",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "189",
"language_id": "1",
"title": "Kurtis",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "190",
"language_id": "1",
"title": "Sarees",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "191",
"language_id": "1",
"title": "Lehengas",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "192",
"language_id": "1",
"title": "Swimming Suit",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "193",
"language_id": "1",
"title": "Men's Footwear",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "194",
"language_id": "1",
"title": "Shoes",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "195",
"language_id": "1",
"title": "Sneakers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "196",
"language_id": "1",
"title": "Sandals & Floaters",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "197",
"language_id": "1",
"title": "Slippers & Flip Flops",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "198",
"language_id": "1",
"title": "Loafers",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "199",
"language_id": "1",
"title": "Boots",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "200",
"language_id": "1",
"title": "Shoe Care",
"description": ""
}
}
]
},
{
"0": {
"info": {
"megamenu_id": "201",
"language_id": "1",
"title": "Women's Jewellery",
"description": ""
}
},
"subsubmenu": [
{
"infosub": {
"megamenu_id": "202",
"language_id": "1",
"title": "Earrings",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "203",
"language_id": "1",
"title": "Bangles",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "204",
"language_id": "1",
"title": "Bracelets",
"description": ""
}
},
{
"infosub": {
"megamenu_id": "205",
"language_id": "1",
"title": "Rings",
"description": ""
}
}
]
}
]
}
},
{
"menu": {
"megamenu_id": "220",
"language_id": "1",
"title": "Care",
"description": ""
}
},
{
"menu": {
"megamenu_id": "221",
"language_id": "1",
"title": "Offers",
"description": ""
}
},
{
"menu": {
"megamenu_id": "222",
"language_id": "1",
"title": "News",
"description": ""
}
}
]
}
这可以使用 built_value 来完成。 link 中提供了详细的文档。
您只需编写一些样板代码和 运行 这个命令 flutter packages pub run build_runner build
。
下面是一个类似于 POJO 的示例class。
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'auth.g.dart';
abstract class Auth implements Built<Auth, AuthBuilder> {
static Serializer<Auth> get serializer => _$authSerializer;
String get currentServerTime;
int get defaultOrganization;
String get tokenExpiryTimeInMs;
bool get rememberMe;
int get failedLoginAttempts;
int get userId;
String get status;
String get token;
Auth._();
factory Auth([updates(AuthBuilder b)]) = _$Auth;
}
下面是序列化器class:
library serializers;
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'auth/auth.dart';
part 'serializers.g.dart';
@SerializersFor(const [
Auth,
])
Serializers serializers = _$serializers;
Serializers standardSerializers =
(serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
下面是从 JSON 到 Object 的转换代码。
Auth auth = standardSerializers.deserializeWith(
Auth.serializer, json.decode(res.body)['user']);
希望这对您有所帮助。
json_serializable 没有很好的文档记录,但它确实可以满足您的需求,比 built_value 更易于使用并且需要更少的样板,尤其是在涉及数组时。
import 'package:json_annotation/json_annotation.dart';
import 'dart:convert';
part 'school.g.dart';
@JsonSerializable()
class School {
final String name;
final int maxStudentCount;
final List<Student> students;
School(this.name, this.maxStudentCount, this.students);
factory School.fromJson(Map<String, dynamic> json) => _$SchoolFromJson(json);
Map<String, dynamic> toJson() => _$SchoolToJson(this);
}
@JsonSerializable()
class Student {
final String name;
final DateTime birthDate;
Student({this.name, this.birthDate});
factory Student.fromJson(Map<String, dynamic> json) => _$StudentFromJson(json);
Map<String, dynamic> toJson() => _$StudentToJson(this);
}
test() {
String jsonString = '''{
"name":"Trump University",
"maxStudentCount":9999,
"students":[
{
"name":"Peter Parker",
"birthDate":"1999-01-01T00:00:00.000Z"
}
]
}''';
final decodedJson = json.decode(jsonString);
final school = School.fromJson(decodedJson);
assert(school.students.length == 1);
}
它还支持枚举序列化。
要生成序列化代码,运行:
flutter packages pub run build_runner build
所以,在对 json_serializable 库进行了一些尝试之后,我想出了自己的解决方案,它根本不需要任何外部库,而且工作起来很有魅力。 这样我就不必编写更少的样板代码,我认为这是一种干净的方法。
模型的制作方法如下
class SideMenuRes {
final int status;
final String message;
final List<SideMenuDatum> sideMenuData;
SideMenuRes({this.status, this.message, this.sideMenuData});
factory SideMenuRes.fromJson(Map json) {
return SideMenuRes(
status: json['status'],
message: json['message'],
sideMenuData: json['status'] == 200 ? (json['data'] as List).map((i) => new
SideMenuDatum.fromJson(i)).toList() : null,
);
}
}
class SideMenuDatum {
final Menu menu;
SideMenuDatum({this.menu});
factory SideMenuDatum.fromJson(Map json) {
return SideMenuDatum(
menu: Menu.fromJson(json['menu']),
);
}
}
class Menu {
final String megamenu_id;
final String language_id;
final String title;
final String description;
final List<SubMenu> subMenu;
Menu({this.megamenu_id, this.language_id, this.title, this.description, this.subMenu});
factory Menu.fromJson(Map json) {
return Menu(
megamenu_id: json['megamenu_id'],
language_id: json['language_id'],
title: json['title'],
description: json['description'],
subMenu: json['submenu'] != null ? (json['submenu'] as List).map((i) => new SubMenu.fromJson(i)).toList() : null
);
}
}
class SubMenu {
final Zero zero;
final List<SubSubMenu> subSubMenu;
SubMenu({this.zero, this.subSubMenu});
factory SubMenu.fromJson(Map json) {
return SubMenu(
zero: Zero.fromJson(json['0']),
subSubMenu: (json['subsubmenu'] as List).map((i) => new SubSubMenu.fromJson(i)).toList()
);
}
}
class Zero {
final Info info;
Zero({this.info});
factory Zero.fromJson(Map json) {
return Zero(
info: Info.fromJson(json['info']),
);
}
}
class SubSubMenu {
final InfoSub infoSub;
SubSubMenu({this.infoSub});
factory SubSubMenu.fromJson(Map json) {
return SubSubMenu(
infoSub: InfoSub.fromJson(json['infosub'])
);
}
}
class InfoSub {
final String megamenu_id;
final String language_id;
final String title;
final String description;
InfoSub({this.megamenu_id, this.language_id, this.title, this.description});
factory InfoSub.fromJson(Map json) {
return InfoSub(
megamenu_id: json['megamenu_id'],
language_id: json['language_id'],
title: json['title'],
description: json['description']
);
}
}
class Info {
final String megamenu_id;
final String language_id;
final String title;
final String description;
Info({this.megamenu_id, this.language_id, this.title, this.description});
factory Info.fromJson(Map json) {
return Info(
megamenu_id: json['megamenu_id'],
language_id: json['language_id'],
title: json['title'],
description: json['description']
);
}
}
然后这样称呼它
SubMenuRes subMenuRes = SubMenuRes.fromJson(response.data);
就是这样!
Android Studio 插件:https://plugins.jetbrains.com/plugin/12562-jsontodart-json-to-dart-
在线: https://app.quicktype.io/?l=dart
手动解析:https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51
从 JSON
生成 Dart classes将 JSON 转换为 Dart class
从 JSON 或 JSON-Schema 生成 Dart class。
请查看 this post 以获得最适合您目标的选项