【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )(一)

简介: 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )(一)

文章目录

一、JSON 序列化工具

二、JSON 手动序列化

三、根据 JSON 编写 Dart 模型类

四、在线自动转换

五、相关资源





一、JSON 序列化工具


JSON 格式比较简单的话 , 使用自带的 dart:convert 包 , 手动进行 JSON 的序列化与反序列化的操作即可 ;


/// json 序列化 , 反序列化 包
import 'dart:convert';



如果 JSON 格式很复杂 , 就需要使用 JSON 的序列化插件 ;


json_serializable : https://pub.dev/packages/json_serializable

built_value : https://pub.dev/packages/built_value





二、JSON 手动序列化


给定如下 JSON 字符串 :


{
  "icon": "icon.png",
  "title": "标题",
  "url": "https://www.baidu.com/",
  "statusBarColor": "FFFFFF",
  "hideAppBar": true
}


写成一行 :


{ "icon": "icon.png", "title": "标题", "url": "https://www.baidu.com/", "statusBarColor": "FFFFFF", "hideAppBar": true }

1

将上述 JSON 字符串序列化为 Map<String, dynamic> 格式的数据 ;


代码示例 :


import 'dart:convert';
void main() {
  String jsonString = '{ "icon": "icon.png", "title": "标题", "url": "https://www.baidu.com/", "statusBarColor": "FFFFFF", "hideAppBar": true }';
  /// 处理中文乱码
  Utf8Codec utf8codec = Utf8Codec();
  Utf8Decoder utf8decoder = Utf8Decoder();
  Utf8Encoder utf8encoder = Utf8Encoder();
  /// 将二进制 Byte 数据以 UTF-8 格式编码 , 获取编码后的字符串
  String responseString = utf8decoder.convert(utf8codec.encode(jsonString));
  // 将 json 字符串信息转为 Map<String, dynamic> 类型的键值对信息
  Map<String, dynamic> jsonMap = json.decode(responseString);
  // 使用工厂方法构造 Dart 对象
  CommonModel commonModel = CommonModel.fromJson(jsonMap);
  print('icon : ${commonModel.icon}\ntittle : ${commonModel.title}\nurl : ${commonModel.url}');
}
// Dart 模型类
class CommonModel {
  final String? icon;
  final String? title;
  final String? url;
  final String? statusBarColor;
  final bool? hideAppBar;
  CommonModel({this.icon, this.title, this.url, this.statusBarColor, this.hideAppBar});
  factory CommonModel.fromJson(Map<String, dynamic> json) {
    return CommonModel(
      icon: json['icon'],
      title: json['title'],
      url: json['url'],
      statusBarColor: json['statusBarColor'],
      hideAppBar: json['hideAppBar'],
    );
  }
}


执行结果 :


icon : icon.png
tittle : 标题
url : https://www.baidu.com/








三、根据 JSON 编写 Dart 模型类


给定一个指定格式的 JSON 类 , 将其转为 Dart , 如果进行手动转换 ,


{
  "school": "第一小学",
  "students": [
    {
      "name": "小王",
      "age": "12"
    },
    {
      "name": "小白",
      "age": "13"
    }
  ]
}


成员变量是普通变量的情况 : 没有使用 final 修饰 ;


class School {
  /// json 字符串中 school 字段
  String? school;
  /// json 字符串中的 students 数组
  List<Student>? students;
  School({this.school, this.students});
  /// 构造方法有两种写法
  /// 参数不是 final 类型的 , 就使用这种方式编写
  /// 方法前不需要添加 factory
  /// 如果成员是 final 类型的 , 那么方法前需要加入 factory
  School.fromJson(Map<String, dynamic> json) {
    school = json['school'];
    /// 先将 json 数组转为 List
    /// 然后调用 map 方法 , 为具体的每个元素赋值
    (json['students'] as List).map((i) => Student.fromJson(i));
  }
}
class Student {
  String? name;
  String? age;
  Student({this.name, this.age});
  Student.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    age = json['age'];
  }
}


成员变量使用 final 修饰的情况 :


class School {
  /// json 字符串中 school 字段
  final String? school;
  /// json 字符串中的 students 数组
  final List<Student>? students;
  School({this.school, this.students});
  /// 构造方法有两种写法
  /// 参数不是 final 类型的 , 就使用这种方式编写
  /// 方法前不需要添加 factory
  /// 如果成员是 final 类型的 , 那么方法前需要加入 factory
  factory School.fromJson(Map<String, dynamic> json) {
    String school = json['school'];
    /// 先将 json 数组转为 List
    /// 然后调用 map 方法 获取每个值
    List<Student> students = (json['students'] as List).map((i) => Student.fromJson(i)).toList();
    return School(school: school, students: students);
  }
}
class Student {
  final String? name;
  final String? age;
  Student({this.name, this.age});
  factory Student.fromJson(Map<String, dynamic> json) {
    String name = json['name'];
    String age = json['age'];
    return Student(name: name, age: age);
  }
}



目录
相关文章
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
228 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
243 1
|
4月前
|
XML JSON 编解码
从JSON到Protobuf,深入序列化方案的选型与原理
序列化是数据跨边界传输的“翻译官”,将结构化数据转为二进制流。JSON可读性强但冗余大,Protobuf高效紧凑、性能优越,成主流选择。不同场景需权衡标准化与定制优化,选最合适方案。
358 3
|
6月前
|
JSON 人工智能 Go
在Golang中序列化JSON字符串的教程
在Golang中,使用`json.Marshal()`可将数据结构序列化为JSON格式。若直接对JSON字符串进行序列化,会因转义字符导致错误。解决方案包括使用`[]byte`或`json.RawMessage()`来避免双引号被转义,从而正确实现JSON的序列化与反序列化。
317 7
|
7月前
|
XML JSON Java
go语言之JSON序列化
本文介绍了Go语言中的JSON序列化与反序列化,其操作与Java类似。需要注意的是,由于Go语言的包管理机制,变量和引入包的首字母需大写,以便其他包引用。示例代码展示了如何将`Student`结构体进行JSON序列化(返回字节数组,需转为字符串)及反序列化。此外,文章还说明了通过tag(如`json`和`xml`)指定序列化变量的重要性,以避免因包间访问限制导致反序列化失败或值为null的问题。
143 0
|
8月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
427 7
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
375 4
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
460 3
|
7月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
135 1