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;
  }
}
相关推荐
LGGGGGQ3 小时前
嵌入式学习-PyTorch(4)-day21
学习
艾莉丝努力练剑4 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
人生游戏牛马NPC1号5 小时前
学习 Flutter (三):玩安卓项目实战 - 上
android·学习·flutter
没有羊的王K9 小时前
SSM框架学习——day1
java·学习
林林要一直努力10 小时前
AOSP Settings模块问题初窥
android·学习·bug·android studio
断剑重铸之日13 小时前
Flutter 滑动面板组件(修复版)
flutter·性能优化
余大侠在劈柴13 小时前
pdf.js 开发指南:在 Web 项目中集成 PDF 预览功能
前端·javascript·学习·pdf
钟智强13 小时前
Flutter 前端开发中的常见问题全面解析
android·前端·flutter·ios·前端框架·dart
有谁看见我的剑了?15 小时前
iperf3 网络带宽测试工具学习
学习·测试工具
老神在在00115 小时前
SpringMVC2
java·前端·学习·spring·java-ee