写点什么

dart 系列之: 还在为编码解码而烦恼吗? 用 dart 试试

作者:程序那些事
  • 2021 年 12 月 02 日
  • 本文字数:1171 字

    阅读完需:约 4 分钟

dart系列之:还在为编码解码而烦恼吗?用dart试试

简介

在我们日常使用的数据格式中 json 应该是最为通用的一个。很多时候,我们需要把一个对象转换成为 JSON 的格式,也可以说需要把对象编码为 JSON。

虽然在 dart 中所有的字符都是以 UTF-16 来存储的,但是更加通用的格式应该是 UTF-8,同样的 dart 也提供了对 UTF-8 的编码支持。

所有的这一切,都包含在 dart:convert 包中。

要想使用 convet 包,简单的引入即可:

import 'dart:convert';
复制代码

为 JSON 编码和解码

首先要注意的是,虽然 dart 中可以用单引号或者双引号来表示字符串,但是在 json 中,字符串必须是以双引号来表示的,否则就不是一个真正的 json,这点一定要注意,所以,我们需要这样定义 JSON :

var studentJson = '''  [    {"name": "jack"},    {"age": 18}  ]''';
复制代码

而不是这样:

var studentJson = '''  [    {'name': 'jack'},    {'age': 18}  ]''';
复制代码

如果要让 json 字符串转换成为对象,则可以使用 convert 包里面的 jsonDecode 方法:

var studentList = jsonDecode(studentJson);assert(studentList is List);
var student = studentList[0];assert(student is Map);assert(student['name'] == "jack");
复制代码

除了 decode 之外,还可以将对象 encode 成为 Json 字符串:

var studentList = [  {"name": "jack"},  {"age": 18}];
var studentString = jsonEncode(studentList);assert(studentString == '[{"name":"jack"},{"age":18}]');
复制代码

上面对象只是一个简单的对象,可以直接转换成为 JSON。如果是复杂对象怎么办呢?

比如对象中嵌套对象,那么嵌入的对象是否也会被转换成为 JSON 呢?

dart 考虑到了这个问题,所以在 jsonEncode 方法中还有第二个参数,表示如何将不可直接 encode 的对象转换成为可以 encode 的对象:

String jsonEncode(Object? object,        {Object? toEncodable(Object? nonEncodable)?}) =>    json.encode(object, toEncodable: toEncodable);
复制代码

如果第二个参数被忽略了,那么会调用对应对象的.toJson()方法。

UTF-8 编码和解码

先看下 UTF-8 的解码方法:

 String decode(List<int> codeUnits, {bool? allowMalformed})
复制代码

第一个参数是传入一个 UTF-8 的 codeUnits 数组,第二个参数表示是否替换 Unicode 替换字符的字符序列U+FFFD。 如果传入 false 的话,遇到这样的字符就会抛出 FormatException。

看一个使用的例子:

List<int> utf8Bytes = [119, 119, 119, 46, 102, 108, 121, 100, 101, 97, 110, 46, 99, 111, 109];
var site = utf8.decode(utf8Bytes); assert(site == 'www.flydean.com');
复制代码

相应的,可以使用 encode 对字符串或者其他对象进行编码:

print(utf8.encode('www.flydean.com'));
复制代码

总结

以上 dart 对 json 和 UTF-8 的支持。

本文已收录于 http://www.flydean.com/19-dart-decode-encode/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 18 小时前阅读数: 5
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
dart系列之:还在为编码解码而烦恼吗?用dart试试