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	&#59;	;   	semicolon
   141  60	3C	00111100	&#60;	<   	less than
   142  61	3D	00111101	&#61;	=   	equality sign
   143  62	3E	00111110	&#62;	>   	greater than
   144  63	3F	00111111	&#63;	?   	question mark
   145  64	40	01000000	&#64;	@   	at sign
   146  65	41	01000001	&#65;	A	 
   147  66	42	01000010	&#66;	B	 
   148  67	43	01000011	&#67;	C	 
   149  68	44	01000100	&#68;	D	 
   150  69	45	01000101	&#69;	E	 
   151  70	46	01000110	&#70;	F	 
   152  71	47	01000111	&#71;	G	 
   153  72	48	01001000	&#72;	H	 
   154  73	49	01001001	&#73;	I	 
   155  74	4A	01001010	&#74;	J	 
   156  75	4B	01001011	&#75;	K	 
   157  76	4C	01001100	&#76;	L	 
   158  77	4D	01001101	&#77;	M	 
   159  78	4E	01001110	&#78;	N	 
   160  79	4F	01001111	&#79;	O	 
   161  80	50	01010000	&#80;	P	 
   162  81	51	01010001	&#81;	Q	 
   163  82	52	01010010	&#82;	R	 
   164  83	53	01010011	&#83;	S	 
   165  84	54	01010100	&#84;	T	 
   166  85	55	01010101	&#85;	U	 
   167  86	56	01010110	&#86;	V	 
   168  87	57	01010111	&#87;	W	 
   169  88	58	01011000	&#88;	X	 
   170  89	59	01011001	&#89;	Y	 
   171  90	5A	01011010	&#90;	Z	 
   172  91	5B	01011011	&#91;	[   	left square bracket
   173  92	5C	01011100	&#92;	\   	backslash
   174  93	5D	01011101	&#93;	]   	right square bracket
   175  94	5E	01011110	&#94;	^   	caret / circumflex
   176  95	5F	01011111	&#95;	_   	underscore
   177  96	60	01100000	&#96;	`   	grave / accent
   178  97	61	01100001	&#97;	a	 
   179  98	62	01100010	&#98;	b	 
   180  99	63	01100011	&#99;	c	 
   181  100	64	01100100	&#100;	d	 
   182  101	65	01100101	&#101;	e	 
   183  102	66	01100110	&#102;	f	 
   184  103	67	01100111	&#103;	g	 
   185  104	68	01101000	&#104;	h	 
   186  105	69	01101001	&#105;	i	 
   187  106	6A	01101010	&#106;	j	 
   188  107	6B	01101011	&#107;	k	 
   189  108	6C	01101100	&#108;	l	 
   190  109	6D	01101101	&#109;	m	 
   191  110	6E	01101110	&#110;	n	 
   192  111	6F	01101111	&#111;	o	 
   193  112	70	01110000	&#112	p	 
   194  113	71	01110001	&#113;	q	 
   195  114	72	01110010	&#114;	r	 
   196  115	73	01110011	&#115;	s	 
   197  116	74	01110100	&#116;	t	 
   198  117	75	01110101	&#117;	u	 
   199  118	76	01110110	&#118;	v	 
   200  119	77	01110111	&#119;	w	 
   201  120	78	01111000	&#120;	x	 
   202  121	79	01111001	&#121;	y	 
   203  122	7A	01111010	&#122;	z	 
   204  123	7B	01111011	&#123;	{   	left curly bracket
   205  124	7C	01111100	&#124;	|   	vertical bar
   206  125	7D	01111101	&#125;	}   	right curly bracket
   207  126	7E	01111110	&#126;	~   	tilde
   208  127	7F	01111111	&#127;	DEL  	delete