美文网首页Flutter
Flutter-JSON读取和解析

Flutter-JSON读取和解析

作者: WinJayQ | 来源:发表于2020-04-18 23:22 被阅读0次

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

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

    1. JSON资源配置

    JSON也属于一种资源,所以在使用之前需要先进行相关的配置


    image.png

    JSON文件内容:

    [{
            "nickName": "李明",
            "roomName": "8801",
            "roomSrc": "https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"
        },
        {
            "nickName": "王小",
            "roomName": "8802",
            "roomSrc": "https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"
        },
        {
            "nickName": "张三",
            "roomName": "8803",
            "roomSrc": "https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"
        }
    ]
    

    2. JSON读取解析

    2.1 JSON资源读取

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

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

    2.2 JSON字符串转化

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

    Future<List<Anchor>> getAnchors() async {
        //1. 读取json文件
        String jsonString = await rootBundle.loadString("assets/test.json");
    
        //2.转成List或Map类型
        final jsonResult = json.decode(jsonString);
    
        //遍历List,并且转成Anchor对象放到另一个List中
        List<Anchor> anchors = new List();
        for(Map<String,dynamic> map in jsonResult) {
          anchors.add(Anchor.withMap(map));
        }
    
        return anchors;
      }
    

    2.3 对象Model定义

    将JSON转成了List和Map类型后,就可以将List中的一个个Map转成Model对象,所以我们需要定义自己的Model

    import 'package:flutter/services.dart' show rootBundle;
    import 'dart:convert';
    import 'dart:async';
    
    class Anchor {
      String nickName;
      String roomName;
      String imageUrl;
    
      Anchor({
        this.nickName,
        this.roomName,
        this.imageUrl
    });
    
      Anchor.withMap(Map<String,dynamic> parseMap) {
        this.nickName = parseMap["nickName"];
        this.roomName = parseMap["roomName"];
        this.imageUrl = parseMap["roomSrc"];
      }
    
      Future<List<Anchor>> getAnchors() async {
        //1. 读取json文件
        String jsonString = await rootBundle.loadString("assets/test.json");
    
        //2.转成List或Map类型
        final jsonResult = json.decode(jsonString);
    
        //遍历List,并且转成Anchor对象放到另一个List中
        List<Anchor> anchors = new List();
        for(Map<String,dynamic> map in jsonResult) {
          anchors.add(Anchor.withMap(map));
        }
    
        return anchors;
      }
    
      @override
      String toString() {
        return "$nickName - $roomName : $imageUrl";
      }
    }
    

    3. JSON解析代码

    这里我单独创建了一个anchor.dart的文件,在其中定义了所有的相关代码:

    • 之后外界只需要调用我内部的getAnchors就可以获取到解析后的数据了
    import 'package:flutter/material.dart';
    import 'anchor.dart';
    
    main(List<String> args) {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text("HelloWorld"),
            ),
            body: MyHomeBody(),
          ),
        );
      }
    }
    
    class MyHomeBody extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        var future = Anchor().getAnchors();
        future.then((value) {
          print(value.toString());
        }).catchError((error) {
          // 捕获出现异常时的情况
          print(error);
        });
        return Center(child: Text("json文件读取"));
      }
    }
    
    image.png

    学习内容来自Flutter从入门到实战

    相关文章

      网友评论

        本文标题:Flutter-JSON读取和解析

        本文链接:https://www.haomeiwen.com/subject/tjezvhtx.html