目录
简介
为 JSON 编码和解码
UTF-8 编码和解码
总结
简介
在我们日常使用的数据格式中 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/
最通俗的解读, 最深刻的干货, 最简洁的教程, 众多你不知道的小技巧等你来发现!
来源: https://www.cnblogs.com/flydean/p/15648634.html