目录
一、在线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 三方库转换
...