簡介
在我們日常使用的資料格式中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/
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!