Flutter 中的 JSON 解析,程序员工作2年月薪12K

person_service.dart

import ‘package:flutter/services.dart’;
import ‘dart:convert’;
import ‘dart:async’;
import ‘…/models/person.dart’;

// 读取 assets 文件夹中的 person.json 文件
Future _loadPersonJson() async {
return await rootBundle.loadString(‘assets/person.json’);
}

// 将 json 字符串解析为 Person 对象
Future decodePerson() async {
// 获取本地的 json 字符串
String personJson = await _loadPersonJson();

// 解析 json 字符串,返回的是 Map<String, dynamic> 类型
final jsonMap = json.decode(personJson);

print(‘jsonMap runType is ${jsonMap.runtimeType}’);

Person person = Person.fromJson(jsonMap);

print(
‘person name is ${person.name}, age is ${person.age}, height is ${person.height}’);

return person;
}

输入如下:

flutter: jsonMap runType is _InternalLinkedHashMap<String, dynamic>
flutter: person name is jack, age is 18, height is 175.0

可以看出 json.decode(personJson) 方法返回的类型为 _InternalLinkedHashMap<String, dynamic> ,意思就是这个 Map 的 key 为 String 类型,而 value 的类型为 dynamic 的,也就是动态的,就如 person.json 中,key 都是 String 类型的,但是 value 可能是 String 、int、double 等等类型。

包含数组的对象

定义一个 country.json 如下:

{
“name”: “China”,
“cities”: [
“Beijing”,
“Shanghai”
]
}

实体类如下:

class Country {
String name;
List cities;

Country({this.name, this.cities});

factory Country.fromJson(Map<String, dynamic> json) {
return Country(name: json[‘name’], cities: json[‘cities’]);
}
}

Service 类如下:

import ‘dart:async’;
import ‘package:flutter/services.dart’;
import ‘dart:convert’;
import ‘…/models/country.dart’;

Future _loadCountryJson() async {
return await rootBundle.loadString(‘assets/country.json’);
}

Future decodeCountry() async {
String countryJson = await _loadCountryJson();

Map<String, dynamic> jsonMap = json.decode(countryJson);

Country country = Country.fromJson(jsonMap);
print(‘country name is ${country.name}’);
return country;
}

然后我们在 main() 中去调用 decodeCountry() 运行,报错了…

Unhandled Exception: type ‘List’ is not a subtype of type ‘List’

错误日志说 List<dynamic> 不是 List<String> 的子类型,也就是我们在country的实体类中直接给 cities 属性赋值为 cities: json['cities'],我们先来看看 json['cities'] 是什么类型:

factory Country.fromJson(Map<String, dynamic> json) {
print(‘json[“cities”] type is ${json[‘cities’].runtimeType}’);
return Country(name: json[‘name’], cities: json[‘cities’]);
}

输出如下:

flutter: json[“cities”] type is List

这个时候我们需要将 Country.fromJson(...) 方法作如下更改:

factory Country.fromJson(Map<String, dynamic> json) {
print(‘json[“cities”] type is ${json[‘cities’].runtimeType}’);
var originList = json[‘cities’];
List cityList = new List.from(originList);
return Country(name: json[‘name’], cities: cityList);
}

上述代码中,我们创建了一个 List<String> 类型的数组,然后将 List<dynamic> 数组中的元素都添加到了 List<String> 中。输出如下:

flutter: json[“cities”] type is List
flutter: country name is China

对象嵌套

定义一个 shape.json ,格式如下:

{
“name”: “rectangle”,
“property”: {
“width”: 5.0,
“height”: 10.0
}
}

实体如下:

class Shape {
String name;
Property property;

Shape({this.name, this.property});

factory Shape.fromJson(Map<String, dynamic> json) {
return Shape(name: json[‘name’], property: json[‘property’]);
}
}

class Property {
double width;
double height;

Property({this.width, this.height});

factory Property.fromJson(Map<String, dynamic> json) {
return Property(width: json[‘width’], height: json[‘height’]);
}
}

Service 类如下:

import ‘dart:async’;
import ‘dart:convert’;
import ‘package:flutter/services.dart’;
import ‘…/models/shape.dart’;

Future _loadShapeJson() async {
return await rootBundle.loadString(‘assets/shape.json’);
}

Future decodeShape() async {
String shapeJson = await _loadShapeJson();

Map<String, dynamic> jsonMap = json.decode(shapeJson);

Shape shape = Shape.fromJson(jsonMap);

print(‘shape name is ${shape.name}’);
return shape;
}

运行之后,会报如下错误:

Unhandled Exception: type ‘_InternalLinkedHashMap<String, dynamic>’ is not a subtype of type ‘Property’

也就是说 property: json['property'] 这里赋值的类型是 _InternalLinkedHashMap<String, dynamic> 而不是 Propertyjson['property'] 的值是这样的 {width: 5.0, height: 10.0},它是一个 Map ,并不是一个 Property 对象,我们需要先将这个 Map 转化为对象,然后在赋值:

factory Shape.fromJson(Map<String, dynamic> json) {
print(‘json[“property”] is ${json[‘property’]}’);
Property property = Property.fromJson(json[‘property’]); // new line
return Shape(name: json[‘name’], property: property);
}

输出:

shape name is rectangle

复杂的对象数组嵌套

{
“id”: “0302”,
“class_name”: “三年二班”,
“students”: [
{
“name”: “叶湘伦”,
“sex”: “男”
},
{
“name”: “路小雨”,
“sex”: “女”
}
]
}

实体:

class ClassInfo {
String id;
String name;
List studentList;

ClassInfo({this.id, this.name, this.studentList});

factory ClassInfo.fromJson(Map<String, dynamic> json) {
return ClassInfo(
id: json[‘id’],
name: json[‘class_name’],
studentList: json[‘students’]);
}
}

class Student {
String name;
String sex;

Student({this.name, this.sex});

factory Student.fromJson(Map<String, dynamic> json) {
return Student(name: json[‘name’], sex: json[‘sex’]);
}
}

service:

import ‘dart:async’;
import ‘dart:convert’;
import ‘package:flutter/services.dart’;
import ‘…/models/class_info.dart’;

Future _loadClassInfoJson() async {
return await rootBundle.loadString(‘assets/class_info.json’);
}

Future decodeClassInfo() async {
String classInfoJson = await _loadClassInfoJson();

Map<String, dynamic> jsonMap = json.decode(classInfoJson);

ClassInfo classInfo = ClassInfo.fromJson(jsonMap);
classInfo.studentList
.forEach((student) => print(‘student name is ${student.name}’));
return classInfo;
}

上述代码在运行后还是会报错:

Unhandled Exception: type ‘List’ is not a subtype of type ‘List’

同样,还是在 studentList: json['students'] 出问题了,我们把 json['students'] 的输出来看看:

[{name: 叶湘伦, sex: 男}, {name: 路小雨, sex: 女}]

上述结果的类型为 List<dynamic> 。现在我们需要将 List<dynamic> 转换到一个 List<Student> 类型的数组中,这里需要用到一个操作符 mapmap 操作符的作用就是将某种类型转换为另一种类型。如下:

factory ClassInfo.fromJson(Map<String, dynamic> json) {
final originList = json[‘students’] as List;
List studentList =
originList.map((value) => Student.fromJson(value)).toList();
return ClassInfo(
id: json[‘id’], name: json[‘class_name’], studentList: studentList);
}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

)]

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter是一种跨平台的移动应用开发框架可以用于快速构建高性能、美观的应用程序。在Flutter,使用JSONJavaScript Object Notation)来进行数据的序列化和反序列化是非常常见的操作。 要在Flutter使用JSON,可以按照以下步骤进行操作: 1. 定义数据模型:首先,需要定义一个数据模型类来表示JSON数据的结构。可以使用Dart语言提供的类来定义属性和方法。例如,假设有一个名为User的数据模型类,可以定义如下: ```dart class User { final String name; final int age; User({required this.name, required this.age}); factory User.fromJson(Map<String, dynamic> json) { return User( name: json['name'], age: json['age'], ); } Map<String, dynamic> toJson() { return { 'name': name, 'age': age, }; } } ``` 2. 序列化和反序列化:在数据模型类,可以定义一个`fromJson`方法来将JSON数据转换为对象,以及一个`toJson`方法来将对象转换为JSON数据。这两个方法可以使用Dart语言提供的`json`库来实现。例如,在上述的User类,`fromJson`和`toJson`方法的实现如下: ```dart factory User.fromJson(Map<String, dynamic> json) { return User( name: json['name'], age: json['age'], ); } Map<String, dynamic> toJson() { return { 'name': name, 'age': age, }; } ``` 3. 使用JSON数据:一旦定义了数据模型类并实现了序列化和反序列化的方法,就可以在应用程序使用JSON数据了。例如,可以通过以下方式将JSON数据转换为对象: ```dart String jsonStr = '{"name": "John", "age": 25}'; Map<String, dynamic> jsonData = json.decode(jsonStr); User user = User.fromJson(jsonData); ``` 或者将对象转换为JSON数据: ```dart User user = User(name: "John", age: 25); String jsonStr = json.encode(user.toJson()); ``` 这样,就可以方便地在Flutter应用程序使用JSON数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值