• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Flutter json_serializablejson泛型常用方法(genericArgumentFactories)

武飞扬头像
qq_20352713
帮助1

 json_serializable是flutter开发中比较流行的插件了.由于dart禁止运行时反射,没有不能动态获取类型来创建对象.所以在解析json的时候比较麻烦

这里介绍最通用的方法


json例子:

  1.  
    {
  2.  
    "code": 200001,
  3.  
    "msg": "success",
  4.  
    "data": {
  5.  
    "mydata": {
  6.  
    "name": "张三",
  7.  
    "age": "21",
  8.  
    "tel": "1539324****",
  9.  
    "balance": "100"
  10.  
    }
  11.  
    }
  12.  
    }

使用genericArgumentFactories

首先genericArgumentFactories参数设置为true,就开启了框架默认的json解析方式

  1.  
    @JsonSerializable(genericArgumentFactories: true)
  2.  
    class BaseJson<T> {
  3.  
    int? code;
  4.  
    String? msg;
  5.  
    T? data;
  6.  
    }

 可以看到生成的解析方法多了一个函数参数`T Function(Object? json) fromJsonT,`并且把我们的泛型data字段,当做参数传入.所以我们解析的时候,只需要把泛型的fromJson调用一下就行了

  1.  
    BaseJson<T> _$BaseJsonFromJson<T>(
  2.  
    Map<String, dynamic> json,
  3.  
    T Function(Object? json) fromJsonT,
  4.  
    ) =>
  5.  
    BaseJson<T>()
  6.  
    ..code = json['code'] as int?
  7.  
    ..msg = json['msg'] as String?
  8.  
    ..data = _$nullableGenericFromJson(json['data'], fromJsonT);
  9.  
     
  10.  
    Map<String, dynamic> _$BaseJsonToJson<T>(
  11.  
    BaseJson<T> instance,
  12.  
    Object? Function(T value) toJsonT,
  13.  
    ) =>
  14.  
    <String, dynamic>{
  15.  
    'code': instance.code,
  16.  
    'msg': instance.msg,
  17.  
    'data': _$nullableGenericToJson(instance.data, toJsonT),
  18.  
    };
学新通
  1.  
    T? _$nullableGenericFromJson<T>(
  2.  
    Object? input,
  3.  
    T Function(Object? json) fromJson,
  4.  
    ) =>
  5.  
    input == null ? null : fromJson(input);

 对应上面的json,写好3个model.

  1.  
     
  2.  
    @JsonSerializable(genericArgumentFactories: true)
  3.  
    class BaseJson<T> {
  4.  
    int? code;
  5.  
    String? msg;
  6.  
    T? data;
  7.  
     
  8.  
    BaseJson();
  9.  
     
  10.  
    factory BaseJson.fromJson(
  11.  
    Map<String, dynamic> json, T Function(dynamic json) fromJsonT) =>
  12.  
    _$BaseJsonFromJson(json, fromJsonT);
  13.  
     
  14.  
    Map<String, dynamic> toJson(
  15.  
    Object? Function(T value) toJsonT,
  16.  
    ) =>
  17.  
    _$BaseJsonToJson(this, toJsonT);
  18.  
    }
  19.  
     
  20.  
    @JsonSerializable(genericArgumentFactories: true)
  21.  
    class Data1<T> {
  22.  
    T? mydata;
  23.  
     
  24.  
    Data1();
  25.  
     
  26.  
    factory Data1.fromJson(
  27.  
    Map<String, dynamic> json, T Function(dynamic json) fromJsonT) =>
  28.  
    _$Data1FromJson(json, fromJsonT);
  29.  
     
  30.  
    Map<String, dynamic> toJson(
  31.  
    Object? Function(T value) toJsonT,
  32.  
    ) =>
  33.  
    _$Data1ToJson(this, toJsonT);
  34.  
    }
  35.  
     
  36.  
    @JsonSerializable()
  37.  
    class MyData {
  38.  
    String? name;
  39.  
    String? age;
  40.  
    String? tel;
  41.  
    String? balance;
  42.  
     
  43.  
    MyData();
  44.  
     
  45.  
    factory MyData.fromJson(Map<String, dynamic> json) => _$MyDataFromJson(json);
  46.  
     
  47.  
    Map<String, dynamic> toJson() => _$MyDataToJson(this);
  48.  
    }
学新通

 带有泛型的 fromJson跟toJson与普通的Json转换有所不同

而且`T Function(Object? json) fromJsonT,`自动生成的函数参数类型是Object?,我们使用的时候要转类型,为了方便直接改成dynamic


测试一下

  1.  
    var jsonData =
  2.  
    "{\"code\": 200001,\"msg\": \"success\",\"data\": {\"mydata\": {\"name\": \"张三\",\"age\": \"21\",\"tel\": \"1539324****\",\"balance\": \"100\"}}}";
  3.  
     
  4.  
    //JSON字符串解析成map
  5.  
    var jsonMap = json.decoder.convert(jsonData);
  6.  
     
  7.  
    //map转model
  8.  
    BaseJson<Data1<MyData>> baseJson = BaseJson.fromJson(jsonMap, (json) {
  9.  
    return Data1.fromJson(json, (json) {
  10.  
    return MyData.fromJson(json);
  11.  
    });
  12.  
    });
  13.  
     
  14.  
    //model转jsonMap
  15.  
    print(baseJson.toJson((value) => value.toJson((value) => value.toJson())));
学新通

学新通

学新通


把data改成list的话再试一下

  1.  
    {
  2.  
    "code": 200001,
  3.  
    "msg": "success",
  4.  
    "data": [
  5.  
    {
  6.  
    "name": "张三",
  7.  
    "age": "21",
  8.  
    "tel": "1539324****",
  9.  
    "balance": "100"
  10.  
    }
  11.  
    ]
  12.  
    }
  1.  
    var jsonData =
  2.  
    "{\"code\": 200001,\"msg\": \"success\",\"data\": [{\"name\":\"张三\",\"age\": \"21\",\"tel\": \"1539324****\",\"balance\": \"100\"}]}";
  3.  
    var jsonMap = json.decoder.convert(jsonData);
  4.  
    BaseJson<List<MyData>> baseJson = BaseJson.fromJson(jsonMap, (json) {
  5.  
    //判断json是不是数组类型
  6.  
    if (json is List) {
  7.  
    //map操作符遍历生产model
  8.  
    return json.map((e) => MyData.fromJson(e)).toList();
  9.  
    }
  10.  
    //其它情况返回个空数组
  11.  
    return [];
  12.  
    });
  13.  
     
  14.  
    print(baseJson.toJson((value) => value.map((value) => value.toJson()).toList()));

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgakkef
系列文章
更多 icon
同类精品
更多 icon
继续加载