github.com/lxt1045/json@v0.0.0-20231013032136-54d6b1d6e525/ascii.md (about) 1 RFC8259: 2 空格: '\ ', '\t', '\r', '\n' 3 4 JSON格式是1999年《JavaScript Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScript以eval()函数(javascript通过eval()调用解析器)读入。不过这并不代表JSON无法使用于其他语言,事实上几乎所有与网络开发相关的语言都有JSON函数库。 5 6 JSON的基本数据类型: false / null / true / object / array / number / string 7 number = [ minus ] int [ frac ] [ exp ] 8 9 数值:十进制数,不能有前导0,可以为负数,可以有小数部分。还可以用e或者E表示指数部分。不能包含非数,如NaN。不区分整数与浮点数。JavaScript用双精度浮点数表示所有数值。 10 字符串:以双引号""括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列。 11 布尔值:表示为true或者false。 12 数组:有序的零个或者多个值。每个值可以为任意类型。序列表使用方括号[,]括起来。元素之间用逗号,分割。形如:[value, value] 13 对象:若干无序的“键-值对”(key-value pairs),其中键只能是字符串[1]。建议但不强制要求对象中的键是独一无二的。对象以花括号{开始,并以}结束。键-值对之间使用逗号分隔。键与值之间用冒号:分割。 14 空值:值写为null 15 16 token(6种标点符号、字符串、数值、3种字面量)之间可以存在有限的空白符并被忽略。四个特定字符被认为是空白符:空格符、水平制表符、回车符、换行符。空白符不能出现在token内部(但空格符可以出现在字符串内部)。JSON标准不允许有字节序掩码,不提供注释的句法。 一个有效的JSON文档的根节点必须是一个对象或一个数组。 17 18 JSON交换时必须编码为UTF-8。[2]转义序列可以为:“\\”、“\"”、“\/”、“\b”、“\f”、“\n”、“\r”、“\t”,或Unicode16进制转义字符序列(\u后面跟随4位16进制数字)。对于不在基本多文种平面上的码位,必须用UTF-16代理对(surrogate pair)表示,例如对于Emoji字符——喜极而泣的表情(U+1F602 😂 face with tears of joy)在JSON中应表示为: 19 { "face": "😂" } 20 // or 21 { "face": "\uD83D\uDE02" } 22 23 注意:golang 的 []byte 比较特殊,会被编码为 base64 形式,需要特殊处理 24 25 26 ------------ 27 在 Go 中并不是所有的类型都能进行序列化: 28 JSON object key 只支持 string 29 Channel、complex、function 等 type 无法进行序列化 30 数据中如果存在循环引用,则不能进行序列化,因为序列化时会进行递归 31 Pointer 序列化之后是其指向的值或者是 nil 32 只有 struct 中支持导出的 field 才能被 JSON package 序列化,即首字母大写的 field。 33 反序列化: 34 `json:"field,string"` 35 `json:"some_field,omitempty"` 36 `json:"-"` 37 默认的 JSON 只支持以下几种 Go 类型: 38 bool for JSON booleans 39 float64 for JSON numbers 40 string for JSON strings 41 nil for JSON null 42 反序列化对 slice、map、pointer 的处理: 43 如果我们序列化之前不知道其数据格式,我们可以使用 interface{} 来存储我们的 decode 之后的数据: 44 var f interface{} 45 err := json.Unmarshal(b, &f) 46 key 是 string,value 是存储在 interface{} 内的。想要获得 f 中的数据,我们首先需要进行 type assertion, 47 然后通过 range 迭代获得 f 中所有的 key : 48 m := f.(map[string]interface{}) 49 for k, v := range m { 50 switch vv := v.(type) { 51 case string: 52 fmt.Println(k, "is string", vv) 53 case float64: 54 fmt.Println(k, "is float64", vv) 55 case []interface{}: 56 fmt.Println(k, "is an array:") 57 for i, u := range vv { 58 fmt.Println(i, u) 59 } 60 default: 61 fmt.Println(k, "is of a type I don't know how to handle") 62 } 63 } 64 Stream JSON: 65 除了 marshal 和 unmarshal 函数,Go 还提供了 Decoder 和 Encoder 对 stream JSON 进行处理,常见 request 66 中的 Body、文件等 67 68 嵌入式 struct 的序列化: 69 Go 支持对 nested struct 进行序列化和反序列化: 70 自定义序列化函数: 71 Go JSON package 中定了两个 Interface Marshaler 和 Unmarshaler ,实现这两个 Interface 可以让你定义的 72 type 支持序列化操作。 73 74 ----- 75 76 1. 可以使用缓存池 sync.Pool(不合适,没有合适的回收时机,,,), 或者自己实现生成池 77 2. 用 string 替换[]byte,因为前者可以复用 string 给输出端 78 79 80 Dec Hex Binary HTML Char Description 81 0 00 00000000 � NUL Null 82 1 01 00000001  SOH Start of Header 83 2 02 00000010  STX Start of Text 84 3 03 00000011  ETX End of Text 85 4 04 00000100  EOT End of Transmission 86 5 05 00000101  ENQ Enquiry 87 6 06 00000110  ACK Acknowledge 88 7 07 00000111  BEL Bell 89 8 08 00001000  BS Backspace 90 9 09 00001001 	 HT Horizontal Tab 91 10 0A 00001010 LF Line Feed 92 11 0B 00001011  VT Vertical Tab 93 12 0C 00001100  FF Form Feed 94 13 0D 00001101 CR Carriage Return 95 14 0E 00001110  SO Shift Out 96 15 0F 00001111  SI Shift In 97 16 10 00010000  DLE Data Link Escape 98 17 11 00010001  DC1 Device Control 1 99 18 12 00010010  DC2 Device Control 2 100 19 13 00010011  DC3 Device Control 3 101 20 14 00010100  DC4 Device Control 4 102 21 15 00010101  NAK Negative Acknowledge 103 22 16 00010110  SYN Synchronize 104 23 17 00010111  ETB End of Transmission Block 105 24 18 00011000  CAN Cancel 106 25 19 00011001  EM End of Medium 107 26 1A 00011010  SUB Substitute 108 27 1B 00011011  ESC Escape 109 28 1C 00011100  FS File Separator 110 29 1D 00011101  GS Group Separator 111 30 1E 00011110  RS Record Separator 112 31 1F 00011111  US Unit Separator 113 32 20 00100000   space Space 114 33 21 00100001 ! ! exclamation mark 115 34 22 00100010 " " double quote 116 35 23 00100011 # # number 117 36 24 00100100 $ $ dollar 118 37 25 00100101 % % percent 119 38 26 00100110 & & ampersand 120 39 27 00100111 ' ' single quote 121 40 28 00101000 ( ( left parenthesis 122 41 29 00101001 ) ) right parenthesis 123 42 2A 00101010 * * asterisk 124 43 2B 00101011 + + plus 125 44 2C 00101100 , , comma 126 45 2D 00101101 - - minus 127 46 2E 00101110 . . period 128 47 2F 00101111 / / slash 129 48 30 00110000 0 0 zero 130 49 31 00110001 1 1 one 131 50 32 00110010 2 2 two 132 51 33 00110011 3 3 three 133 52 34 00110100 4 4 four 134 53 35 00110101 5 5 five 135 54 36 00110110 6 6 six 136 55 37 00110111 7 7 seven 137 56 38 00111000 8 8 eight 138 57 39 00111001 9 9 nine 139 58 3A 00111010 : : colon 140 59 3B 00111011 ; ; semicolon 141 60 3C 00111100 < < less than 142 61 3D 00111101 = = equality sign 143 62 3E 00111110 > > greater than 144 63 3F 00111111 ? ? question mark 145 64 40 01000000 @ @ at sign 146 65 41 01000001 A A 147 66 42 01000010 B B 148 67 43 01000011 C C 149 68 44 01000100 D D 150 69 45 01000101 E E 151 70 46 01000110 F F 152 71 47 01000111 G G 153 72 48 01001000 H H 154 73 49 01001001 I I 155 74 4A 01001010 J J 156 75 4B 01001011 K K 157 76 4C 01001100 L L 158 77 4D 01001101 M M 159 78 4E 01001110 N N 160 79 4F 01001111 O O 161 80 50 01010000 P P 162 81 51 01010001 Q Q 163 82 52 01010010 R R 164 83 53 01010011 S S 165 84 54 01010100 T T 166 85 55 01010101 U U 167 86 56 01010110 V V 168 87 57 01010111 W W 169 88 58 01011000 X X 170 89 59 01011001 Y Y 171 90 5A 01011010 Z Z 172 91 5B 01011011 [ [ left square bracket 173 92 5C 01011100 \ \ backslash 174 93 5D 01011101 ] ] right square bracket 175 94 5E 01011110 ^ ^ caret / circumflex 176 95 5F 01011111 _ _ underscore 177 96 60 01100000 ` ` grave / accent 178 97 61 01100001 a a 179 98 62 01100010 b b 180 99 63 01100011 c c 181 100 64 01100100 d d 182 101 65 01100101 e e 183 102 66 01100110 f f 184 103 67 01100111 g g 185 104 68 01101000 h h 186 105 69 01101001 i i 187 106 6A 01101010 j j 188 107 6B 01101011 k k 189 108 6C 01101100 l l 190 109 6D 01101101 m m 191 110 6E 01101110 n n 192 111 6F 01101111 o o 193 112 70 01110000 p p 194 113 71 01110001 q q 195 114 72 01110010 r r 196 115 73 01110011 s s 197 116 74 01110100 t t 198 117 75 01110101 u u 199 118 76 01110110 v v 200 119 77 01110111 w w 201 120 78 01111000 x x 202 121 79 01111001 y y 203 122 7A 01111010 z z 204 123 7B 01111011 { { left curly bracket 205 124 7C 01111100 | | vertical bar 206 125 7D 01111101 } } right curly bracket 207 126 7E 01111110 ~ ~ tilde 208 127 7F 01111111  DEL delete