Flutter学习10 - Json解析与Model使用

对于网络请求返回的 Json 数据,一般会进行如下解析:

  • 将 Json String 解析为 Map<String, dynamic>
  • 将 Json String 解析为 Dart Model

发起一个返回 Json String 的网络请求

dart 复制代码
import 'package:http/http.dart' as http;

void main() {
  _doGet();
}

_doGet() async {
  var url =
      Uri.parse("https://cx.shouji.360.cn/phonearea.php?number=17688888888");
  var response = await http.get(url);
  if (response.statusCode == 200) {
    //请求成功
    print("请求成功:");
    String jsonStr = response.body;
    print(jsonStr); // {"code":"0","data":{"province":"广东","city":"广州","sp":"联通"}}
  } else {
    //请求失败
    print("请求失败:");
    print("错误码:${response.statusCode}");
    print("错误信息:${response.body}");
  }
}

该请求返回的数据结构为

bash 复制代码
{
	"code":"0",
	"data":{
		"province":"广东",
		"city":"广州",
		"sp":"联通"
	}
}

1、Json String 转 Map<String, dynamic>

引入

dart 复制代码
import 'dart:convert';

jsonDecode()

dart 复制代码
_json2Map(String jsonStr) {
  Map<String, dynamic> map1 = jsonDecode(jsonStr);
  print(map1['code']); // 0
  print(map1['data']); // {province: 广东, city: 广州, sp: 联通}

  Map<String, dynamic> map2 = map1['data'];
  print(map2['province']); // 广东
  print(map2['city']); // 广州
  print(map2['sp']); // 联通
}

2、Json String 转 Dart Model

Json String 转 Model 中 Model 的要求:

  1. 字段不能为私有
  2. 普通构造函数
  3. 声明为 XXX.fromJson 的命名构造函数
  4. 声明为 Map<String, dynamic> toJson() 成员函数

Model

bash 复制代码
{
	"code":"0",
	"data":{
		"province":"广东",
		"city":"广州",
		"sp":"联通"
	}
}
dart 复制代码
class Location {
  String? province;
  String? city;
  String? sp;

  Location({this.province, this.city, this.sp});

  Location.fromJson(Map<String, dynamic> json) {
    province = json['province'];
    city = json['city'];
    sp = json['sp'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['province'] = province;
    data['city'] = city;
    data['sp'] = sp;
    return data;
  }
}
dart 复制代码
//4、声明为Map<String, dynamic> toJson成员函数
class DataModel {
  int? code;
  Location? data;

  DataModel({this.code, this.data});

  DataModel.fromJson(Map<String, dynamic> json) {
    code = json['code'];
    //注意此处传值
    data = Location.fromJson(json['data']);
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> d = <String, dynamic>{};
    d['code'] = code;
    //注意此处传值
    d['data'] = data?.toJson();
    return d;
  }
}

转换

dart 复制代码
_json2Model(String jsonStr) {
  Map<String, dynamic> map = jsonDecode(jsonStr);
  DataModel model = DataModel.fromJson(map);
  print(model.code); // 0
  print(model.data?.toJson()); // {province: 广东, city: 广州, sp: 联通}
  print(model.data?.province); // 广东
  print(model.data?.city); // 广州
  print(model.data?.sp); // 联通
}

在线转换工具

Json String 转 Dart Model 在线工具Í

3、界面实例

main.dart

dart 复制代码
import 'package:flutter/material.dart';
import 'Json2MapModelPage.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Leon Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const Json2MapModelPage(),
    );
  }
}

Json2MapModelPage.dart

dart 复制代码
import 'dart:convert';
import 'package:flutter/material.dart';
import 'DataModel.dart';

class Json2MapModelPage extends StatefulWidget {
  const Json2MapModelPage({super.key});

  @override
  State<Json2MapModelPage> createState() => _Json2MapModelPageState();
}

class _Json2MapModelPageState extends State<Json2MapModelPage> {
  final String _jsonStr =
      '{"code":"0","data":{"province":"广东","city":"广州","sp":"联通"}}';

  var showResultJson2Map = "";
  var showResultJson2Model = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Json 解析 Demo"),
      ),
      body: Column(
        children: [
          _json2MapBtn(),
          Text("json 2 map 解析结果:\n $showResultJson2Map"),
          _json2ModelBtn(),
          Text("json 2 Model 解析结果:\n $showResultJson2Model"),
        ],
      ),
    );
  }

  _json2MapBtn() {
    return ElevatedButton(
        onPressed: _json2map, child: const Text('Json 转 Map'));
  }

  void _json2map() {
    Map<String, dynamic> map = jsonDecode(_jsonStr);
    setState(() {
      showResultJson2Map =
          "code: ${map['code']}\ndata: ${map['data']}\nprovince: ${map['data']['province']}   city: ${map['data']['city']}  sp: ${map['data']['sp']}";
    });
  }

  _json2ModelBtn() {
    return ElevatedButton(
        onPressed: _json2Model, child: const Text('Json 转 Model'));
  }

  void _json2Model() {
    PhoneModel model = PhoneModel.fromJson(jsonDecode(_jsonStr));
    setState(() {
      showResultJson2Model =
          "code: ${model.code}\ndata: ${model.data?.toJson()}\nprovince: ${model.data?.province}  city: ${model.data?.city}  sp: ${model.data?.sp}";
    });
  }
}

DataModel.dart

利用在线转换工具转换

dart 复制代码
///
/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/
///
class PhoneModelData {
/*
{
  "province": "广东",
  "city": "广州",
  "sp": "联通"
}
*/

  String? province;
  String? city;
  String? sp;

  PhoneModelData({
    this.province,
    this.city,
    this.sp,
  });

  PhoneModelData.fromJson(Map<String, dynamic> json) {
    province = json['province']?.toString();
    city = json['city']?.toString();
    sp = json['sp']?.toString();
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['province'] = province;
    data['city'] = city;
    data['sp'] = sp;
    return data;
  }
}

class PhoneModel {
/*
{
  "code": "0",
  "data": {
    "province": "广东",
    "city": "广州",
    "sp": "联通"
  }
}
*/

  String? code;
  PhoneModelData? data;

  PhoneModel({
    this.code,
    this.data,
  });

  PhoneModel.fromJson(Map<String, dynamic> json) {
    code = json['code']?.toString();
    data =
        (json['data'] != null) ? PhoneModelData.fromJson(json['data']) : null;
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['code'] = code;
    if (data != null) {
      data['data'] = this.data!.toJson();
    }
    return data;
  }
}
相关推荐
小a杰.16 分钟前
Flutter国际化(i18n)实现详解
flutter
冲,干,闯22 分钟前
CH32V307以太网学习
学习
嗝o゚25 分钟前
开源鸿蒙 Flutter 应用包瘦身实战
flutter·华为·开源·harmonyos
测试小张z37 分钟前
软考自学两个月通过系统集成项目管理师的考试
学习·学习方法
小a杰.1 小时前
Flutter 响应式设计基础
flutter
‿hhh1 小时前
学习笔记整理(部分)
java·开发语言·笔记·学习·mvc
狮恒1 小时前
OpenHarmony Flutter 分布式设备发现与连接:无感组网与设备协同管理方案
分布式·flutter·wpf·openharmony
Ki13811 小时前
我的AI学习小结:从入门到放弃
人工智能·学习
Yilena1 小时前
通过mysqldump进行数据迁移时权限不足的解决方案
数据库·学习
嗝o゚2 小时前
Flutter与开源鸿蒙:一场“应用定义权”的静默战争,与开发者的“范式跃迁”机会
python·flutter