dart系列之:還在爲編碼解碼而煩惱嗎?用dart試試 簡介 爲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/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!

歡迎關注我的公衆號:「程序那些事」,懂技術,更懂你!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章