Flutter JSON解析插件d_json的使用
Flutter JSON解析插件d_json的使用
Dart JSON处理库
在Dart语言中,JSON数据序列化后的数据类型通常是Map或者List的实例。当嵌套较深时,取用其中的数据需要进行复杂的判断,例如判断键是否存在或数组是否越界,这会使代码变得复杂。使用d_json
可以简化并快速获取任意层次的数据。
请各位大佬多多指教,给个Star,您的支持是我不断前进的动力,谢谢。
特性
- 支持下标语法多级Map、List混用取值。
- 使用简单且安全。
安装
在pubspec.yaml
文件中添加以下依赖:
dependencies:
d_json: ^0.0.4
使用
示例数据
首先定义一个测试数据对象:
// 测试数据
final data = {
"code": "00000",
"message": "成功",
"payload": [
{
"goodsId": "10039353087490",
"goodsName": "全20册儿童奇妙大自然科普百科儿童绘本3-6岁 幼儿园中大班宝宝启蒙认知睡前故事书彩图注音版 儿童情商逆商培养反霸凌启蒙绘本 奇妙大自然科普绘本全套20册",
"bandName": "荷甄",
"monthSales": 0,
"price": 119.8,
"priceStr": "119.8",
"isMember": true,
"lowestCouponPrice": 29.8,
"szmfPrice": 27.12,
"commission": 2.68,
"goodsUrl": "item.jd.com/10039353087490.html",
"couponList": [
{
"quota": 115,
"link":
"http://coupon.m.jd.com/coupons/show.action?linkKey=AAROH_xIpeffAs_-naABEFoeUbAT-bFsQXW_QVwYsO047q8BYGC7i_nyOUgXUQ-IMOhWdG8CMP97-OiQ_sOjYkzPMC93qQ&to=www.jd.com",
"discount": 90,
"type": 3
}
],
"shopInfo": {"shopId": 10330852, "shopName": "四维图书专营店"},
"mainPic": "https://img14.360buyimg.com/pop/jfs/t1/203268/1/21329/420195/62562364E75f53dfb/0a1bd80dd3815873.jpg",
"jumpLink": null,
"pid": "1234"
},
],
"pageIndex": 1,
"pageSize": 20,
"total": 192
};
取出第一条数据的shopName数据
常规用法
由于List或Map为null时,下标取值会抛出异常,因此为了代码的安全性,我们需要进行逐层判断:
String shopName = '';
//
if (data['payload'] is List &&
(data['payload'] as List).isNotEmpty &&
(data['payload'] as List)[0] is Map &&
(data['payload'] as List)[0]['shopInfo'] is Map &&
(data['payload'] as List)[0]['shopInfo']['shopName'] is String) {
shopName = (data['payload'] as List)[0]['shopInfo']['shopName'] as String;
}
使用d_json
使用d_json
插件可以简化上述过程,避免复杂的判断:
import 'package:d_json/d_json.dart';
// 数据为Map或List数据时
final json = DJson(data);
// 数据为JsonString数据时
final json = DJson.fromJsonStr(data);
// 使用d_json取数据
final shopName = DJson(data)['payload'][0]['shopInfo']['shopName'].stringValue;
初始化
import 'package:d_json/d_json.dart';
// 数据为Map或List数据时
final json = DJson(data);
// 数据为JsonString数据时
final json = DJson.fromJsonStr(data);
下标语法
支持List中下标、Map中key值多层级混用:
// data数据中取出第一条数据的shopName数据
final shopName = DJson(data)['payload'][0]['shopInfo']['shopName'].stringValue;
// 获取data中message数据,不存在时返回默认值
final message = DJson(data)['message'].stringOrDefValue('未知错误');
// 获取data中第一条数据中的价格
final price = DJson(data)['payload'][0]['price'].doubleValue;
常用类型
以下是常用的类型方法:
// 初始化
final json = DJson(data);
// 返回可选类型,类型匹配且存在才有值,否则返回null
final _ = json["xxx"].stringValue; // 获取可选String
final _ = json["xxx"].numValue; // 获取可选num
final _ = json["xxx"].intValue; // 获取可选int
final _ = json["xxx"].doubleValue; // 获取可选double
final _ = json["xxx"].boolValue; // 获取可选bool
final _ = json["xxx"].mapValue; // 获取可选Map
final _ = json["xxx"].listValue; // 获取可选List
// 返回不为空的类型,类型匹配且存在才有值,否则返回默认值
final _ = json["xxx"].stringOrDefValue(''); // 获取String
final _ = json["xxx"].numOrDefValue(0); // 获取num
final _ = json["xxx"].intOrDefValue(0); // 获取int
final _ = json["xxx"].doubleOrDefValue(0); // 获取double
final _ = json["xxx"].boolOrDefValue(true); // 获取bool
final _ = json["xxx"].mapOrDefValue({}); // 获取Map
final _ = json["xxx"].listOrDefValue([1,2]); // 获取List
// 类型不匹配,强制转换
final _ = json["xxx"].forceToString; // 获取String
final _ = json["xxx"].forceToNum; // 获取num
final _ = json["xxx"].forceToInt; // 获取int
final _ = json["xxx"].forceToDouble; // 获取double
final _ = json["xxx"].forceToBool; // 获取bool
// 常用默认值
final _ = json["xxx"].stringOrEmpty; // 获取String,不存在返回默认值""
final _ = json["xxx"].numOrZero; // 获取num,不存在返回默认值0
final _ = json["xxx"].intOrZero; // 获取int,不存在返回默认值0
final _ = json["xxx"].doubleOrZero; // 获取double,不存在返回默认值0
final _ = json["xxx"].boolOrFalse; // 获取bool,不存在返回默认值false
final _ = json["xxx"].mapOrEmpty; // 获取Map,不存在返回默认值{}
final _ = json["xxx"].listOrEmpty; // 获取List,不存在返回默认值[]
更多关于Flutter JSON解析插件d_json的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter JSON解析插件d_json的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用d_json
插件进行JSON解析的代码示例。d_json
是一个假设的插件名称,实际中可能存在不同的JSON解析库,如json_serializable
、built_value
等。不过,为了贴合你的要求,我会基于一个假设的d_json
插件编写代码示例。
首先,确保你已经在pubspec.yaml
文件中添加了d_json
依赖(注意:这只是一个假设的插件名,实际使用时请替换为真实的JSON解析库):
dependencies:
flutter:
sdk: flutter
d_json: ^x.y.z # 替换为实际的版本号
然后运行flutter pub get
来安装依赖。
接下来,我们创建一个数据模型类,并使用d_json
(假设它提供了类似fromJson
和toJson
的方法)来进行JSON序列化和反序列化。
import 'package:d_json/d_json.dart'; // 假设的导入路径
class User {
String name;
int age;
String email;
// 假设d_json提供了fromJson和toJson方法
User.fromJson(Map<String, dynamic> json) {
name = json['name'];
age = json['age'];
email = json['email'];
}
Map<String, dynamic> toJson() {
return {
'name': name,
'age': age,
'email': email,
};
}
}
注意:在实际中,你可能不需要手动编写这些转换方法,因为像json_serializable
这样的库可以自动生成它们。
现在,我们编写一个Flutter小部件来演示如何使用这个数据模型和假设的d_json
插件进行JSON解析。
import 'package:flutter/material.dart';
import 'dart:convert'; // 用于jsonDecode
import 'user_model.dart'; // 假设我们将User类放在user_model.dart文件中
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter JSON Parsing Demo'),
),
body: Center(
child: UserInfo(),
),
),
);
}
}
class UserInfo extends StatefulWidget {
@override
_UserInfoState createState() => _UserInfoState();
}
class _UserInfoState extends State<UserInfo> {
User? user;
@override
void initState() {
super.initState();
_parseJson();
}
void _parseJson() async {
String jsonString = '''
{
"name": "John Doe",
"age": 30,
"email": "john.doe@example.com"
}
''';
// 假设的d_json解析过程(实际上你可能只需要调用fromJson方法)
// 这里我们模拟了一个解析过程,因为d_json是假设的
Map<String, dynamic> jsonMap = jsonDecode(jsonString);
User parsedUser = User.fromJson(jsonMap);
setState(() {
user = parsedUser;
});
}
@override
Widget build(BuildContext context) {
return user != null
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Name: ${user!.name}'),
Text('Age: ${user!.age}'),
Text('Email: ${user!.email}'),
],
)
: CircularProgressIndicator(); // 显示加载指示器,直到数据加载完成
}
}
在这个示例中,我们模拟了一个JSON字符串,并使用假设的d_json
插件(实际上是通过手动编写的fromJson
方法)将其解析为User
对象。然后,我们在Flutter界面上显示解析后的用户信息。
请记住,这个示例是基于一个假设的d_json
插件。在实际项目中,你可能需要使用像json_serializable
这样的流行库来自动生成JSON序列化和反序列化的代码。