Flutter开发之JSON读取和解析

Posted 梦想家-mxj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter开发之JSON读取和解析相关的知识,希望对你有一定的参考价值。

在开发中,我们经常会使用本地JSON或者从服务器请求数据后回去到JSON,拿到JSON后通常会将JSON转成Model对象来进行后续的操作,因为这样操作更加的方便,也更加的安全。

所以学习JSON的相关操作以及读取JSON后如何转成Model对象对于Flutter开发也非常重要。

1、 JSON资源配置
JSON也属于一种资源,所以在使用之前需要先进行相关的配置。
我们在之前使用Image组件时,用到了本地图片,本地图片必须在pubspec.yaml中进行配置:
在这里插入图片描述
类似的json文件的配置如下:
在这里插入图片描述

2、JSON读取解析
JSON资源读取
如果我们希望读取JSON资源,可以使用package:flutter/services.dart包中的rootBundle。
在rootBundle中有一个loadString方法,可以去加载JSON资源

但是注意,查看该方法的源码,你会发现这个操作是一个异步的。

代码如下:

import'package:flutter/services.dart' show rootBundle;

// 打印读取的结果是一个字符串
rootBundle.loadString('json/test.json').then((value) => print(value));

我的json文件是:
在这里插入图片描述
打印的结果:
在这里插入图片描述

JSON字符串转化

拿到JSON字符串后,我们需要将其转成成我们熟悉的List和Map类型。
我们可以通过dart:convert包中的json.decode方法将其进行转化。

代码如下:

// 1.读取json文件
String jsonString = await rootBundle.loadString("json/test.json");
// 2.转成List或Map类型
final jsonResult = json.decode(jsonString);

Flutter中json转model

在Flutter中,有几种JSON转模型的方式

一、手动转化

JSON转模型,必然可以通过手动来进行转化:

  • 优点:完全是自己可控的,并且需要哪些字段就转化哪些字段,对于不需要的,忽略即可;并且继承关系也会一目了然。
  • 缺点:麻烦,而且容易出错。

对象Model定义

将JSON转成了List和Map类型后,就可以将List中的一个个Map转成Model对象,所以我们需要定义自己的Model
创建 contentModel.dart文件,代码如下:

class ContentModel{
  String status;
  String message;
  Data data;
  ContentModel.fromMap(Map<String,dynamic> json){
    this.status = json["status"];
    this.message = json["message"];
    var data = json["data"];
    this.data = Data.fromMap(data["title"],data['content']);
  }
}
class Data{
  Datatitle title;
  List <contentItem> content;
  Data.fromMap(Map<String,dynamic> title,List<dynamic> content){

    this.title = Datatitle.fromMap(title);
    var contents = content;
    this.content = content.map((item) {
      return contentItem.fromMap(item);
    }).toList();

  }
}
class Datatitle{
  String id;
  String name;
  Datatitle.fromMap(Map<String,dynamic>title){
    this.id = title['id'];
    this.name = title['name'];
  }
}
class contentItem{
  String id;
  String value;
  contentItem.fromMap(Map<String,dynamic>title){
    this.id = title['id'];
    this.value = title['value'];
  }
}

外部使用:

import 'model/contentModel.dart';
var fu = rootBundle.loadString('json/test.json');
    fu.then((value){
      final jsonResult = json.decode(value);
      print(jsonResult.runtimeType);
     Map map = new Map<String, dynamic>.from(jsonResult);
      var model = ContentModel.fromMap(map);
      print(model.data.content[0].value);//打印content第一条数据的value值
    });

打印结果:
在这里插入图片描述

二、json_serializable

json_serializable是dart官方推荐和提供的JSON转Model的方式:

  • 一个自动化源代码生成器来为你生成 JSON 序列化数据模板;
  • 由于序列化数据代码不再需要手动编写或者维护,你可以将序列化 JSON 数据在运行时的异常风险降到最低。

第一步:添加相关的依赖

依赖分为项目依赖(dependencies),开发依赖(dev_dependencies)。

注意:需要执行flutter pub get确保我们的项目中有这些依赖

dependencies:
  json_annotation:^3.0.1

dev_dependencies:
  json_serializable:^3.2.5
  build_runner:^1.8.0

第二步:以json_serializable 的方式创建模型类

以一个简单的Json数据作为例子

final jsonInfo = {
    "nickname": "LiLy",
    "level": 15,
    "courses": ["语文", "数学", "英语"],
    "register_date": "2021-5-10",
    "computer": {
      "brand": "MackBook pro",
      "price": 15000
    }
  };

创建对应的模型

未完待续。。。

以上是关于Flutter开发之JSON读取和解析的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中只解析一次 JSON

Flutter真香,我用它写了个桌面版JSON解析工具

错误记录Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )(代码片段

flutter : 嵌套的 json 解析列表

Android之DOM解析XML

Android之DOM解析XML