DartVM服务器开发(第二十一天)--Dart中的Gson(jaguar_serializer)

今天我们来学习一下如何使用jaguar_serializer包,这里说明一下,该包在三端平台都是可用的(Flutter,dart web ,dart vm),学习过安卓的,都知道gson吧,该包类似于gson

1.引入包

#pubspec.yaml
dependencies:
  jaguar_serializer: ^2.2.0

dev_dependencies:
  build_runner:
  jaguar_serializer_cli:

执行pub get命令

获取成功.png

导包

import 'package:jaguar_serializer/jaguar_serializer.dart';

2.初始化

  • 新增一个实体类
class Person {
  String name;
  int age;
}
  • 添加生成脚本标记
@GenSerializer()
class PersonSerializer extends Serializer<Person> with _$PersonSerializer {
}
  • 运行脚本 使用脚本命令pub run build_runner build

image.png

  • 导入生成代码 回到person这个类的文件中,添加
part 'person.jser.dart';

3.使用

main() async {
  Jaguar(port: 1000)
    ..get('/person', (ctx){
      PersonSerializer personSerializer=new PersonSerializer();
      Person person=new Person()
      ..name='rhyme'
      ..age=18;
 //personSerializer.toMap(person)获取到map对象
      return Response.json( personSerializer.toMap(person));
    })
    ..log.onRecord.listen(print)
    ..serve(logRequests: true);
}

然后我们来请求一下

image.png

成功返回了json数据

4.使用详解

  • json与对象相互转换
import 'dart:convert';
main(){
  String jsonString='{"name":"rhyme","age":18}';
  PersonSerializer personSerializer=new PersonSerializer();

  // json to entity
  Person person=personSerializer.fromMap(json.decode(jsonString));
  print('name:${person.name} ,age: ${person.age}');

  //entity to json
  String toJson= json.encode( personSerializer.toMap(person));
  print(toJson);
}
  • json 与对象列相互转换
main(){
  String jsonString='[{"name":"rhyme","age":18},{"name":"ben","age":21}]';
  PersonSerializer personSerializer=new PersonSerializer();
  
  // list: json to entity
  //因为目前fromList不支持dynamic的值,所以,我们需要吧json.decode出来的List<dynamic>转化为List<Map>,不然会报异常
  List<Map> mapList=(json.decode(jsonString) as List<dynamic>).map((dy)=>dy as Map).toList();
  List<Person> persons=personSerializer.fromList(mapList);
  for(Person p in persons){
    print('name:${p.name} ,age: ${p.age}');
  }
  //list: entity to json
  String fromJson=json.encode(personSerializer.toList(persons));
  print(fromJson);
}
  • 对象内嵌对象与json相互转换

在对象内添加一个对象

class Person {
  String name;
  int age;
//new
  Info info;
//new
}

//new
class Info{
   String address;
   String phoneNumber;
}
//edit
@GenSerializer( serializers: [ InfoSerializer])
//edit
class PersonSerializer extends Serializer<Person> with _$PersonSerializer {
}

//new
@GenSerializer()
class InfoSerializer extends Serializer<Info> with _$InfoSerializer {
}
//new 

运行命令pub run build_runner build

image.png

转换跟上面相同

 String jsonString='{"name":"rhyme","age":18,"info":{"address":"广州","phoneNumber":"159xxxxxxxx"}}';
  PersonSerializer personSerializer=new PersonSerializer();

  // json to entity
  Person person=personSerializer.fromMap(json.decode(jsonString));
  print('name:${person.name} ,age: ${person.age}');

  //entity to json
  String toJson= json.encode(personSerializer.toMap(person));
  print(toJson);
  • 对象内嵌对象列

将上面的Info改为List<Info> 重新运行命令pub run build_runner build 转换跟上面一样

  String jsonString='[{"name":"rhyme","age":18,"info":[{"address":"广州","phoneNumber":"159xxxxxxxx"},{"address":"北京","phoneNumber":"158xxxxxxxx"}]},{"name":"ben","age":21}]';
  PersonSerializer personSerializer=new PersonSerializer();
  
  // list: json to entity
  //因为目前fromList不支持dynamic的值,所以,我们需要吧json.decode出来的List<dynamic>转化为List<Map>,不然会报异常
  List<Map> mapList=(json.decode(jsonString) as List<dynamic>).map((dy)=>dy as Map).toList();
  List<Person> persons=personSerializer.fromList(mapList);
  for(Person p in persons){
    print('name:${p.name} ,age: ${p.age}');
  }
  //list: entity to json
  String fromJson=json.encode(personSerializer.toList(persons));
  print(fromJson);
  • 对象内嵌多个对象
class Person {
  String name;
  int age;
  List<Info> info;
//new
  Avatar avatar;
//new
}


class Info{
   String address;
   String phoneNumber;
}
//new
class Avatar{
  String url;
  String path;

}
//new

//edit
@GenSerializer( serializers: [ InfoSerializer,AvatarSerializer])
//edit
class PersonSerializer extends Serializer<Person> with _$PersonSerializer {
}

@GenSerializer()
class InfoSerializer extends Serializer<Info> with _$InfoSerializer {
}
//new
@GenSerializer()
class AvatarSerializer extends Serializer<Avatar> with _$AvatarSerializer {
}
//new

然后重新运行命令pub run build_runner build 使用也是跟上面相同

  String jsonString='[{"name":"rhyme","age":18,"avatar":{"url":"http://www.baidu.com","path":"baidu"},"info":[{"address":"广州","phoneNumber":"159xxxxxxxx"},{"address":"北京","phoneNumber":"158xxxxxxxx"}]},{"name":"ben","age":21}]';
  PersonSerializer personSerializer=new PersonSerializer();
  
  // list: json to entity
  //因为目前fromList不支持dynamic的值,所以,我们需要吧json.decode出来的List<dynamic>转化为List<Map>,不然会报异常
  List<Map> mapList=(json.decode(jsonString) as List<dynamic>).map((dy)=>dy as Map).toList();
  List<Person> persons=personSerializer.fromList(mapList);
  for(Person p in persons){
    print('name:${p.name} ,age: ${p.age}');
  }
  //list: entity to json
  String fromJson=json.encode(personSerializer.toList(persons));
  print(fromJson);
  • 别名

有时候,我们的实体类成员变量名跟json数据中对应的字段不相同,可以使用@Alias('')对需要的字段进行标记,里面的值为json对应的字段

class Person {
  @Alias('Name')
  String name;
  int age;
  List<Info> info;
  Avatar avatar;
}

要使上面生效,需要重新运行命令pub run build_runner build

  • Build命令

我们可以发现,当我每次做一个修改,都需要执行pub run build_runner build命令,这样是非常容易导致疏忽的,jaguar_serializer已经为我们考虑到了, 我们可以使用命令

pub run build_runner watch

当该命令运行后,我们的每次点击保存,都会重新激活一次脚本,如下图

image.png

如果你是Flutter开发,可以使用下面的build命令

flutter packages pub run build_runner build

Flutter的监听命令

flutter packages pub run build_runner watch

ok,今天就到这里了,我们明天见!

如果想继续学习DartVM服务器开发,请关注我,学习更多骚操作!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coolblog.xyz技术专栏

自己动手实现一个简单的JSON解析器

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相对于另一种数据交换格式 XML,JSON 有着诸多优点。比如易读...

65419
来自专栏IT可乐

Java IO详解(七)------随机访问文件流

 File 类的介绍:https://cloud.tencent.com/developer/article/1012532 Java IO 流的分类介绍:ht...

2978
来自专栏Spark生态圈

[spark] Shuffle Write解析 (Sort Based Shuffle)

从 Spark 2.0 开始移除了Hash Based Shuffle,想要了解可参考Shuffle 过程,本文将讲解 Sort Based Shuffle。

1402
来自专栏技术博客

Entity Framework DataAnnotations

DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。但是在EF中它又可以对映射关系进行控制,相比较Fluent...

833
来自专栏YG小书屋

Hadoop Streaming 读ORC文件

hadoop Streaming的处理流程是先通过inputFormat读出输入文件内容,将其传递mapper,再将mapper返回的key,value传给re...

1272
来自专栏恰同学骚年

Hadoop学习笔记—7.计数器与自定义计数器

  在上图所示中,计数器有19个,分为四个组:File Output Format Counters、FileSystemCounters、File Input...

1022
来自专栏iOS开发

iOS开发之 Method Swizzling 深入浅出

如果产品经理突然说:"在所有页面添加统计功能,也就是用户进入这个页面就统计一次"。我们会想到下面的一些方法:

4707
来自专栏数据结构与算法

BZOJ1269: [AHOI2006]文本编辑器editor

Descriptio 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器。你能帮助他吗? 为了明确任务目标,可可对“文本编辑器...

2757
来自专栏我杨某人的青春满是悔恨

走进 RxSwift 之观察者模式

RxSwift 是 ReactiveX 系列的 Swift 版本,如果你之前用过 ReactiveCocoa(RAC) 的话,想必对 Functional Re...

1712
来自专栏androidBlog

java 解决文件名重复问题的两种方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

2521

扫码关注云+社区