Flutter json 和 对象之间的转换

Posted 小猪快跑22

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter json 和 对象之间的转换相关的知识,希望对你有一定的参考价值。

这里写的是 Flutter 自带的 convertjson 转换。下面以 3 个实例来说明。

一、自定义对象中不再嵌套其他对象:

class Student 
  String name;
  int age;

  Student(
    required this.name,
    required this.age,
  );

  /// 因为调用 jsonDecode 把 json 串转对象时,jsonDecode 方法的返回值是 map 类型,无法直接转成 Student 对象
  factory Student.fromJson(Map<String, dynamic> parsedJson) 
    return Student(
      name: parsedJson['name'],
      age: parsedJson['age'],
    );
  

  /// 这个方法在对象转json的时候自动被调用
  Map toJson() 
    Map map = Map();
    map["name"] = this.name;
    map["age"] = this.age;
    return map;
  

对象转 json 抽成方法了:
String _getJsonStr() 
  Student student = Student(name: "pig", age: 33);
  String jsonStr = jsonEncode(student);
  return jsonStr;

调用如下:

 String data = _getJsonStr();
 print("data = $data");

输出如下:

json 串转对象
String jsonStr = _getJsonStr();
var data = jsonDecode(jsonStr);
print("data = $data, runtimeType = $data.runtimeType");

输出如下:

可以看出这个 data 类型是 map 类型,此时还没有转成 Student 对象。
要转成 Student 需要如下调用:

 Student st = Student.fromJson(data);
 print("st runtimeType = $st.runtimeType, st name = $st.name");


通过 Student.fromJson 的方法,把 map 转成 Student 对象,Student.fromJson 是定义在 Student 类中的,如下:

 /// 因为调用 jsonDecode 把 json 串转对象时,jsonDecode 方法的返回值是 map 类型,无法直接转成 Student 对象
 factory Student.fromJson(Map<String, dynamic> parsedJson) 
   return Student(
     name: parsedJson['name'],
     age: parsedJson['age'],
   );
 

方法很简单,就是把 map 中的数据取出来,构造成 Student 对象。

对象中嵌套对象

Student 类中嵌套 Grade 对象:

class Student 
  String name;
  int age;
  Grade grade;

  Student(required this.name,
    required this.age,
    required this.grade,
  );

  factory Student.fromJson(Map<String, dynamic> parsedJson) 
    return Student(
      name: parsedJson['name'],
      age: parsedJson['age'],
      grade: Grade.fromJson(parsedJson['grade']),
    );
  

  Map toJson() 
    Map map = Map();
    map["name"] = this.name;
    map["age"] = this.age;
    map["grade"] = this.grade;
    return map;
  


class Grade 
  String className;
  String title;

  Grade(required this.className, required this.title);

  factory Grade.fromJson(Map<String, dynamic> parsedJson) 
    return Grade(
      className: parsedJson['className'],
      title: parsedJson['title'],
    );
  

  Map toJson() 
    Map map = Map();
    map["className"] = this.className;
    map["title"] = this.title;
    return map;
  

没什么大的改变,主要就是 Student.fromJson 中获取 grade 的方式和获取普通变量的方式不一样,如下:

  factory Student.fromJson(Map<String, dynamic> parsedJson) 
    return Student(
      name: parsedJson['name'],
      age: parsedJson['age'],
      grade: Grade.fromJson(parsedJson['grade']),
    );
  

因为 parsedJson['grade'] 得到的仍然是 map 类型,所以需要通过 Grade.fromJson 方法转成 Gradle 对象。

除了嵌套对象外还嵌套对象集合

Student 中除了包含 Grade 对象外,还包含 Address 的列表。

各个类的定义如下:

class Student 
  String name;
  int age;
  Grade grade;
  List<Address> addressList;

  Student(
      required this.name,
        required this.age,
        required this.grade,
        required this.addressList);

  factory Student.fromJson(Map<String, dynamic> parsedJson) 
    /// addressList 是列表 和 grade 的处理方式不一样
    /// 方式 1
    List<Address> addressL = [];
    var list = parsedJson['addressList'];
    for (var address in list) 
      addressL.add(Address.fromJson(address));
    

    /// 方式 2,显然方式2的更加优雅
    List<Address> addressL2 = (parsedJson['addressList'] as List<dynamic>)
        .map((e) => Address.fromJson(e))
        .toList();

    return Student(
      name: parsedJson['name'],
      age: parsedJson['age'],
      grade: Grade.fromJson(parsedJson['grade']),
      addressList: addressL2,
    );
  

  Map toJson() 
    Map map = Map();
    map["name"] = this.name;
    map["age"] = this.age;
    map["grade"] = this.grade;
    map['addressList'] = this.addressList;
    return map;
  



class Grade 
  String className;
  String title;

  Grade(required this.className, required this.title);

  factory Grade.fromJson(Map<String, dynamic> parsedJson) 
    return Grade(
      className: parsedJson['className'],
      title: parsedJson['title'],
    );
  

  Map toJson() 
    Map map = Map();
    map["className"] = this.className;
    map["title"] = this.title;
    return map;
  


class Address 
  String street;
  String district;

  Address(required this.street, required this.district);

  factory Address.fromJson(Map<String, dynamic> parsedJson) 
    return Address(
      street: parsedJson['street'],
      district: parsedJson['district'],
    );
  

  Map toJson() 
    Map map = Map();
    map["street"] = this.street;
    map["district"] = this.district;
    return map;
  

主要的区别依然是 Student.fromJson

factory Student.fromJson(Map<String, dynamic> parsedJson) 
    /// addressList 是列表 和 grade 的处理方式不一样
    /// 方式 1
    List<Address> addressL = [];
    var list = parsedJson['addressList'];
    for (var address in list) 
      addressL.add(Address.fromJson(address));
    

    /// 方式 2,显然方式2的更加优雅
    List<Address> addressL2 = (parsedJson['addressList'] as List<dynamic>)
        .map((e) => Address.fromJson(e))
        .toList();

    return Student(
      name: parsedJson['name'],
      age: parsedJson['age'],
      grade: Grade.fromJson(parsedJson['grade']),
      addressList: addressL2,
    );
  

上面的 var list = parsedJson['addressList']; 获取的类型是 List<dynamic>,是无法直接转成 List< Address>,所以需要遍历 list ,然后通过 Address.fromJson(address)list 里面的对象转成 Address 类型。

上面基本就说完了,其实你可以看看 json_serializable 这个插件,其实也是通过注解来实现上面类似的代码。

以上是关于Flutter json 和 对象之间的转换的主要内容,如果未能解决你的问题,请参考以下文章

Flutter json 和 对象之间的转换

Flutter 从 Json 转换嵌套对象返回 null

Flutter 和 Net Core WebApi 之间的 Json 案例解析问题

正弦波转换为方波

Flutter 将自定义堆叠对象转换为 json

将检索到的json转换为flutter中的自定义对象列表