Flutter1.17使用JSON

JSON格式在代碼編程中,是最常用的格式。那么JSON定義是什么呢?
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結構使得 JSON 成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網(wǎng)絡傳輸效率。
簡要歷史
1999年出現(xiàn),JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。
2001年 JSON是Douglas Crockford開始推廣使用的數(shù)據(jù)格式
2005年-2006年正式成為主流的數(shù)據(jù)格式。
現(xiàn)在廣泛應用
JSON 語法規(guī)則
JSON是一個標記符的序列。這套標記符包含六個構造字符、字符串、數(shù)字和三個字面名。
JSON是一個序列化的對象或數(shù)組。
6個構造字符
begin-array = ws %x5B ws ; [ 左方括號
begin-object = ws %x7B ws ; { 左大括號
end-array = ws %x5D ws ; ] 右方括號
end-object = ws %x7D ws ; } 右大括號
name-separator = ws %x3A ws ; : 冒號
value-separator = ws %x2C ws ; , 逗號
2. 在這6個構造字符的前或后允許存在無意義的空白符(ws):
ws = *(%x20 /; 空間
%x09 /; 水平標簽
%x0A /; 換行或換行
%x0D); 回程
3.JSON的值
3.1 JSON的構成: ws 值 ws [1]?
3.2值可以是對象、數(shù)組、數(shù)字、字符串或者三個字面值(false、null、true)中的一個。值中的字面值中的英文必須使用小寫。
3.3對象由花括號括起來的逗號分割的成員構成,成員是字符串鍵和上文所述的值由逗號分割的鍵值對組成,
?{
"name": "John Doe",?
"age": 18,?
"address": {
? ? ? ? ? ? "country" : "china",?
? ? ? ? ? ? "zip-code": "10000"
? ? ? ? ? ? }
}
3.4數(shù)組是由方括號括起來的一組值構成,如:
[3, 1, 4, 1, 5, 9, 2, 6]?
任何支持的類型都可以通過 JSON 來表示,例如字符串、數(shù)字、對象、數(shù)組等。但是對象和數(shù)組是比較特殊且常用的兩種類型。
對象:對象在 JS 中是使用花括號包裹 {} 起來的內(nèi)容,數(shù)據(jù)結構為 {key1:value1, key2:value2, ...} 的鍵值對結構。在面向?qū)ο蟮恼Z言中,key 為對象的屬性,value 為對應的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。
數(shù)組:數(shù)組在 JS 中是方括號 [] 包裹起來的內(nèi)容,數(shù)據(jù)結構為 ["java", "javascript", "vb", ...] 的索引結構。在 JS 中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可以像對象那樣使用鍵值對,但還是索引使用得多。同樣,值的類型可以是任意類型。
基礎示例
簡單地說,JSON 可以將 JavaScript 對象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在網(wǎng)絡或者程序之間輕松地傳遞這個字符串,并在需要的時候?qū)⑺€原為各編程語言所支持的數(shù)據(jù)格式,例如在 PHP 中,可以將 JSON 還原為數(shù)組或者一個基本對象。在用到AJAX時,如果需要用到數(shù)組傳值,這時就需要用JSON將數(shù)組轉(zhuǎn)化為字符串。?
表示對象
對象是一個無序的“‘名稱/值’對”集合。一個對象以{左括號開始,}右括號結束。每個“名稱”后跟一個:冒號;“‘名稱/值’ 對”之間使用,逗號分隔。
{"firstName": "Brett", "lastName": "McLaughlin"}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
表示數(shù)組和普通的 JS 數(shù)組一樣,JSON 表示數(shù)組的方式也是使用方括號 []。
{?
"persion":[?
{
"firstName": "Brett",? ? ? ? ? ??
"lastName":"McLaughlin"? ? ? ??
},? ? ??
{? ? ? ??
"firstName":"Jason",
"lastName":"Hunter"
}]}
這不難理解。在這個示例中,只有一個名為 persion的變量,值是包含兩個條目的數(shù)組,每個條目是一個人的記錄,其中包含名和姓。上面的示例演示如何用括號將記錄組合成一個值。當然,可以使用相同的語法表示更過多的值(每個值包含多個記錄)。
在處理 JSON 格式的數(shù)據(jù)時,沒有需要遵守的預定義的約束。所以,在同樣的數(shù)據(jù)結構中,可以改變表示數(shù)據(jù)的方式,也可以使用不同方式表示同一事物。
如前面所說,除了對象和數(shù)組,你也可以簡單地使用字符串或者數(shù)字等來存儲簡單的數(shù)據(jù),但這樣并沒有多大意義。
Flutter調(diào)用JSON例子
下載git地址:https://github.com/kenykeny1688888/jsonSample.git? ?
獲取依賴包:flutter pub get
Flutter 通過Json可序列化進行使用
代碼例子說明
定義json的格式,例子中定義下面紅色部分,通過?Map<String,?dynamic> toJson() => _$SerializableSimpleObjectToJson(this); OjectToJson進行轉(zhuǎn)換。
import 'package:json_annotation/json_annotation.dart';
part 'serializable_simple_object.g.dart';
@JsonSerializable()
class SerializableSimpleObject {
?SerializableSimpleObject({
? ?this.aString,
? ?this.anInt,
? ?this.aDouble,
? ?this.aListOfStrings,
? ?this.aListOfInts,
? ?this.aListOfDoubles,
?});
?final String aString;
?final int anInt;
?final double aDouble;
?final List<String> aListOfStrings;
?final List<int> aListOfInts;
?final List<double> aListOfDoubles;
?factory SerializableSimpleObject.fromJson(Map<String, dynamic> json) =>
? ? ?_$SerializableSimpleObjectFromJson(json);
?Map<String, dynamic> toJson() => _$SerializableSimpleObjectToJson(this);
}
運行:flutter run
Flutter運行的JSON例子簡單,這里不做動畫視頻直接貼圖
