Flutter-JSON读取和解析

在开发中,我们经常会使用本地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> getAnchors() async {
    //1. 读取json文件
    String jsonString = await rootBundle.loadString("assets/test.json");

    //2.转成List或Map类型
    final jsonResult = json.decode(jsonString);

    //遍历List,并且转成Anchor对象放到另一个List中
    List anchors = new List();
    for(Map 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 parseMap) {
    this.nickName = parseMap["nickName"];
    this.roomName = parseMap["roomName"];
    this.imageUrl = parseMap["roomSrc"];
  }

  Future> getAnchors() async {
    //1. 读取json文件
    String jsonString = await rootBundle.loadString("assets/test.json");

    //2.转成List或Map类型
    final jsonResult = json.decode(jsonString);

    //遍历List,并且转成Anchor对象放到另一个List中
    List anchors = new List();
    for(Map 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 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读取和解析)