Flutter(二十)——JSON解析

简介: Flutter(二十)——JSON解析

前言


前一篇博文已经详细介绍了Flutter开发中的网络请求,但其实大多数项目中,返回HTML内容是不够的,因为移动端使用的最多的请求是JSON数据,所以我们需要掌握Flutter开发中,JSON解析的知识。JSON(javaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式)


JSON转换成Dart对象


假设,我们现在是开发的是一款新闻App,通过访问相关的接口之后,服务器返回了这样一条简单的JSON数据,如下图所示:

{"title":"疫情疫苗出世,多板块重大利好"}

那么我们应该如何处理这条数据显示在界面上呢?相信有过Java开发Android经验的读者,肯定知道如何把这段数据还原成一个对象,并且在界面显示出来。同样,在Flutter开发中,也可以把这个JSON数据转换为Dart对象,我们先定义Dart对象News,代码如下:

class News{
  final String title;
  News({this.title});
  factory News.fromJson(Map<String,dynamic> json){
    return News(
      title: json['title'],
    );
  }
}


在dart:convert里面有一个JSON常量,它是负责处理服务端返回的JSON数据的,在请求响应回来的时,通过json.decode(response.body)方法调用可以把JSON结果转换城Map类型或List类型。如果是一个JSON对象,返回将是一个Map;如果是JSON数组,则会返回List。


上面代码之所以把map的value定义成dynamic,是因为不肯定value的类型,毕竟有可能是字符串,有可能是整型,还是用这个自动匹配类型最实在。


实践


在JSON解析之后,我们需要把结果通过界面的形式展现给用户看,所以下面我们直接来实现其功能:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState(news: httpPost());
}
class _MyHomePageState extends State<MyHomePage> {
  final Future<News> news;
  _MyHomePageState({Key key,this.news});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("HttpClient"),
      ),
      body:Center(
        child: FutureBuilder<News>(
          future: news,
          builder: (context,snapshot){
            if(snapshot.hasData){
              return Text(snapshot.data.title);
            }else if(snapshot.hasError){
              return Text("错误啦");
            }
            return CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}
Future<News> httpPost() async{
  final response=await http.get("http://liyuanjinglyj.com/demo/");
  if(response.statusCode==200){
    print(utf8.decode(response.bodyBytes));
    return News.fromJson(json.decode(response.body));
  }else{
    throw Exception('请求不到JSon');
  }
}
class News{
  final String title;
  News({this.title});
  factory News.fromJson(Map<String,dynamic> json){
    return News(
      title: json['title'],
    );
  }
}


代码很简单,这里专门定义了一个JSON的Dart类,用于处理JSON数据,同时用FutureBuilder组件将JSON显示在屏幕上。显示效果首图所示。


根据JSON用工具生成实体类


上面可以说是静态生成JSON格式,也就是说手动定义了一个JSON类,但是假如有许多许多JSON格式的数据,那怎么获取JSON数据呢?一个一个写肯定麻烦的很,所以我们需要借助工具去自动生成JSON类,这里就也需要在pubspec.yaml中导入依赖:

dependencies:
  json_annotation: ^2.0.0
dev_dependencies:
  build_runner: ^1.0.0
  json_serializable: ^2.0.0


然后我们创建一个实体类,格式如下:

import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User{
  String name;
  String email;
  User({this.name,this.email});
  factory User.fromJson(Map<String,dynamic> json)=>_$UserFromJson(json);
  Map<String,dynamic> toJson=>_$UserToJson(this);
}


这里会报错,特别是part ‘user.g.dart’;与最后两句,都会出现红色的波浪线提示,但这是正常的不用急,我们可以把上面的代码看成是模板,然后我们在工程目录文件下输入如下命令:

flutter packages pub run build_runner build

输入完这个命令之后,就会生成一个user.g.dart文件,在user.dart同级目录之中,代码如下:

// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'user.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
User _$UserFromJson(Map<String, dynamic> json) {
  return User(name: json['name'] as String, email: json['email'] as String);
}
Map<String, dynamic> _$UserToJson(User instance) =>
    <String, dynamic>{'name': instance.name, 'email': instance.email};


博主为了直观,所以减少了许多参数,但在实际情况中,JSON的参数肯定会有很多,甚至还有层级,那么这种情况下,这样自动生成起来肯定比较方便,也比较节约时间。



但这种方式也会有一个缺陷,就是假如我的JSON格式变更了,那还不得一次一次生成?很显然,Flutter也考虑到这种情况,所以提供给我们一种监听模式来实现每一次的生成,命令如下:

flutter packages pub run build_runner watch

这个命令只需要执行一次,那么就会一直监听在后台运行,在也不要我们操作什么就可以自动生成了。


当JSON类属性与服务器返回属性不一致时

虽然说上面的操作很方便,但自动生成还有一个待解决的问题,那么就是当自己的JSON类与服务器端返回的字段不一致的时候怎么办?当然你可以直接更改字段,但可能一改就要动全部的内容,所以这个时候使用JsonKey注解的方式就比较高效了,比如:

@JsonKey(name:'user_name')
final String userName;

这样注解加自动生成JSON类就非常完美高效,可以大大提高程序的开发效率。

相关文章
|
2月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
3月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
145 67
|
6月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
407 4
JSON数据解析实战:从嵌套结构到结构化表格
|
6月前
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
216 7
|
8月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
8月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
1220 12
|
8月前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
259 12
|
存储 JSON Dart
在Flutter中解析复杂的JSON(一篇顶十篇)
趁着年假,今天在网上看到一篇不错的讲解在Flutter中解析复杂的JSON的文章,于是花了两个小时,翻译,研究,觉得对我收益挺大。分享给大家,欢迎大家点赞转发。,以下为译文,欢迎大家提出疑惑。 我不得不承认,在Flutter / Dart中使用JSON后,我错过了Android的*gson* 世界。当我开始在Flutter中使用API时,JSON解析确实使我非常费力。而且我敢肯定,这会让很多初学者感到困惑。 我们将使用dart:convert此博客的内置库。这是最基本的解析方法,仅在从Flutter开始或正在构建小型项目时才建议使用。尽管如此,了解Flutter中JSON解析的基础还是很重要的
551 0
|
存储 JSON Dart
在Flutter中解析复杂的JSON(一篇顶十篇)
JSON结构#1:简单 map 访问对象 Snippet #1 : imports **Snippet #2 : **加载Json Asset(可选)** Snippet #3 : 加载响应 JSON结构#2:具有数组的简单结构 Json结构#3:简单嵌套结构 JSON结构#4:具有列表的嵌套结构 JSON结构#5: List of maps JSON结构#6:复杂的嵌套结构
498 0
在Flutter中解析复杂的JSON(一篇顶十篇)
|
8月前
flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
108 1

推荐镜像

更多
  • DNS