Flutter随记七:Json数据与Dart对象转换详解

目录

一、JsonToDart工具

二、使用示例

三、其他转换方式



一、在线dart解析工具

目前有一些网页,可以直接将JSON转成Dart对象,再放入工程中。

  • https://javiercbk.github.io/json_to_dart/  (有时网速慢打不开)

  • https://app.quicktype.io     (可以转dart模型,还可以转成swift、java模型等等)

Instantly parse JSON in any language | quicktype

JsonToDart​​​​​​​

二、使用示例

1、MYJSON.json测试数据结构下面这样的。

{
	"body": {
		"code": "0000",
		"data": {
			"msPropcircleworkList": [{
				"articletitle": "测试数据一!",
				"articletags": "冒险,极限"
			},
            {
				"articletitle": "测试数据一",
				"articletags": "旅游,美食"
			},
            {
				"articletitle": "测试数据三",
				"articletags": "文学,美食"
			},
            {
				"articletitle": "测试数据四",
				"articletags": "古玩,美食"
			}]
		}
	}
}

2、引入的tuiJianArticleObject.dart就是转化后的Dart对象文件。

import '../Pages/tuiJianArticleObject.dart';

3、tuiJianStackItem()  该方法获取本地MYJSON.json文件。

Future<Data> tuiJianStackItem() async {
    var value = await rootBundle.loadString('images/MYJSON文件.json');
    Map<String, dynamic> articleM1 = json.decode(value);
    // return msPropcircleworkListM = articleM1['body']['data'];
    TuiJianArticleObject objet = TuiJianArticleObject.fromJson(articleM1);
    setState(() {
      msPropcircleworkListM = objet.body!.data ?? new Data();
    });
    return msPropcircleworkListM;
  }

4、getItem() 和_aricleItem(int i) 该方法根据数据渲染页面。

List<Widget> getItem() {
    List<Widget> ls = [];
    //做对象转化时打开代码
    for (var i = 0;i < (msPropcircleworkListM.msPropcircleworkList?.length ?? 0);i++) {
      ls.add(_aricleItem(i));
    }
     //不做对象转化时 打开下面代码
    // var msPropcircleworkList = msPropcircleworkListM == null
    //     ? []
    //     : msPropcircleworkListM['msPropcircleworkList'];
    // for (var i = 0; i < msPropcircleworkList.length; i++) {
    //   ls.add(_aricleItem(i));
    // }
    return ls.toList();
  }

  Padding _aricleItem(int i) {

    MsPropcircleworkList lsobj = msPropcircleworkListM.msPropcircleworkList![i];//做对象转化时打开代码

    // var msPropcircleworkList = msPropcircleworkListM == null
    //     ? []
    //     : msPropcircleworkListM['msPropcircleworkList'][i]; //不做对象转化时打开代码

    return Padding(
        padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Container(
                color: Colors.white,
                width: MediaQuery.of(context).size.width - 20,
                child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        // msPropcircleworkList['articletitle'], //不做对象转化时打开代码
                        lsobj.articletitle ?? "",
                        maxLines: 2,
                        overflow: TextOverflow.ellipsis,
                        style: TextStyle(
                          fontSize: 14,
                        ),
                      ),
                      Text(
                        // msPropcircleworkList['articletags'], //不做对象转化时打开代码
                          lsobj.articletags ?? "",
                          style: TextStyle(
                            fontSize: 12,
                            color: Colors.red,
                          )),
                      Divider(
                        height: 20,
                        color: Colors.white,
                      )
                    ])),
          ],
        ));
  }

完整demo代码示例:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import '../Pages/tuiJianArticleObject.dart';

class JsonCoverObject extends StatefulWidget {
  JsonCoverObject({Key? key}) : super(key: key);

  @override
  State<JsonCoverObject> createState() => _JsonCoverObjectState();
}

class _JsonCoverObjectState extends State<JsonCoverObject> {
  Data msPropcircleworkListM = new Data(); //做对象转化时打开代码
  // var msPropcircleworkListM; //不做对象转化时打开代码

  @override
  void initState() {
    super.initState();
    //读取本地json文件
    tuiJianStackItem();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        color: Colors.grey,
        child: ListView(
          children: getItem(),
        ));
  }

  List<Widget> getItem() {
    List<Widget> ls = [];
    //做对象转化时打开注释
    for (var i = 0;i < (msPropcircleworkListM.msPropcircleworkList?.length ?? 0);i++) {
      ls.add(_aricleItem(i));
    }
    //不做对象转化时打开注释
    // var msPropcircleworkList = msPropcircleworkListM == null
    //     ? []
    //     : msPropcircleworkListM['msPropcircleworkList'];
    // for (var i = 0; i < msPropcircleworkList.length; i++) {
    //   ls.add(_aricleItem(i));
    // }
    return ls.toList();
  }

  Padding _aricleItem(int i) {
    MsPropcircleworkList lsobj = msPropcircleworkListM.msPropcircleworkList![i];//做对象转化时打开代码

    // var msPropcircleworkList = msPropcircleworkListM == null
    //     ? []
    //     : msPropcircleworkListM['msPropcircleworkList'][i]; //不做对象转化时打开代码

    return Padding(
        padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Container(
                color: Colors.white,
                width: MediaQuery.of(context).size.width - 20,
                child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        // msPropcircleworkList['articletitle'], //不做对象转化时打开代码
                        lsobj.articletitle ?? "",//做对象转化时打开代码
                        maxLines: 2,
                        overflow: TextOverflow.ellipsis,
                        style: TextStyle(
                          fontSize: 14,
                        ),
                      ),
                      Text(
                        // msPropcircleworkList['articletags'], //不做对象转化时打开代码
                          lsobj.articletags ?? "",//做对象转化时打开代码
                          style: TextStyle(
                            fontSize: 12,
                            color: Colors.red,
                          )),
                      Divider(
                        height: 20,
                        color: Colors.white,
                      )
                    ])),
          ],
        ));
  }
//做对象转化时打开代码
  Future<Data> tuiJianStackItem() async {
    var value = await rootBundle.loadString('images/tuijian.json');
    Map<String, dynamic> articleM1 = json.decode(value);
    // return msPropcircleworkListM = articleM1['body']['data'];
    TuiJianArticleObject objet = TuiJianArticleObject.fromJson(articleM1);
    setState(() {
      msPropcircleworkListM = objet.body!.data ?? new Data();
    });
    return msPropcircleworkListM;
  }

// //不做对象转化时打开代码
//   tuiJianStackItem() async {
//     var value = await rootBundle.loadString('images/tuijian.json');
//     Map articleM1 = json.decode(value);
//     setState(() {
//       msPropcircleworkListM = articleM1['body']['data'];
//     });
//   }
}

三、其他转换方式

除以上数据与模型转换方式外,还有利用官方库dart:convert 手动序列化 JSON 数据,还有以 json_serializable 第三方依赖库的方式创建模型。

具体方法参见官网 JSON 和序列化数据 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter

四、json_model 三方库转换

...

Flutter 中可以使用以下方法保存 JSON 数据: 1. 使用 shared_preferences 插件保存数据到本地。这个插件提供了一种简单的 key-value 存储方式,可以用来保存 JSON 数据。以下是保存和读取 JSON 数据的示例代码: ```dart import 'package:shared_preferences/shared_preferences.dart'; import 'dart:convert'; // 保存 JSON 数据 saveData(Map<String, dynamic> data) async { SharedPreferences prefs = await SharedPreferences.getInstance(); String jsonData = json.encode(data); prefs.setString('jsonData', jsonData); } // 读取 JSON 数据 Future<Map<String, dynamic>> loadData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); String jsonData = prefs.getString('jsonData'); if (jsonData == null) return null; return json.decode(jsonData); } ``` 2. 使用文件存储保存 JSON 数据Flutter 提供了一个文件操作类,可以将数据保存到文件中。以下是保存和读取 JSON 数据的示例代码: ```dart import 'dart:async'; import 'dart:convert'; import 'dart:io'; // 保存 JSON 数据 saveData(Map<String, dynamic> data) async { final file = await _localFile; String jsonData = json.encode(data); file.writeAsString(jsonData); } // 读取 JSON 数据 Future<Map<String, dynamic>> loadData() async { try { final file = await _localFile; String jsonData = await file.readAsString(); return json.decode(jsonData); } catch (e) { return null; } } Future<File> get _localFile async { final path = await getApplicationDocumentsDirectory(); return File('$path/data.json'); } ``` 以上是两种常用的保存 JSON 数据的方法,你可以根据自己的需要选择其中一种。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值