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

1 回复

更多关于Flutter JSON解析插件d_json的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用d_json插件进行JSON解析的代码示例。d_json是一个假设的插件名称,实际中可能存在不同的JSON解析库,如json_serializablebuilt_value等。不过,为了贴合你的要求,我会基于一个假设的d_json插件编写代码示例。

首先,确保你已经在pubspec.yaml文件中添加了d_json依赖(注意:这只是一个假设的插件名,实际使用时请替换为真实的JSON解析库):

dependencies:
  flutter:
    sdk: flutter
  d_json: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来安装依赖。

接下来,我们创建一个数据模型类,并使用d_json(假设它提供了类似fromJsontoJson的方法)来进行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序列化和反序列化的代码。

回到顶部