json、MessagePackjavascript
目錄html
json:... 1java
json的數據類型:... 1node
python與json:... 3python
json模塊:... 4c++
java script object notation,js對象標記,是一種輕量級的數據交換格式,它基於ECMAScript(w3c制定的JS規範)的一個子集,採用徹底獨立於編程語言的文本格式來存儲和表示數據;chrome
ECMAScript是標準,json是實現的產品,另ES5、ES6是js產品;編程
注:json
AJAX,async javascript xml,xml逐步被json取代,AJAX用於先後端傳輸數據,AJAX是一種在無需從新加載整個網頁的狀況下,可以更新部分網頁的技術;
chrome中的v8引擎(開天闢地的大事);
nodejs,先後端都可用;
http://www.w3school.com.cn/index.html #web教程
value值:雙引號引發來的字符串,數值、true、false、null、對象、數組,這些都是值;
string字符串:由雙引號包圍起來的任意字符的組合,能夠有轉義字符;
number數值:有正負、有整數、浮點數;
object對象:
無序的鍵值對的集合;
格式:{string1:value1,...stringn:valuen},使用{};
key必須是一個字符串(而python-dict的key能夠爲number),須要雙引號包圍這個字符串;
value能夠是任意合法的值;
array數組:有序的值的集合;
格式:[val1,...valn],使用[];
例:
test.json
{
"person": [
{
"name": "tom",
"age": 18
},
{
"name": "jerry",
"age": 16
} #按嚴格定義,此處}後不能有逗號,但有些環境會自動把逗號去掉
],
"total": 2
}
test2.json
a #單個值也是json
注:
https://www.bejson.com/zhuanyi/ #json壓縮轉義
{"person":[{"name":"tom","age":18},{"name":"jerry","age":16}],"total":2}
python支持少許內建數據類型到json類型的轉換;
Python類型 |
Json類型 |
True |
True |
False |
False |
None |
Null |
str |
string |
int |
integer |
float |
float |
list |
array |
dict |
object |
經常使用方法:
json.dumps(),在內存中操做,py object-->json;
json.loads(),在內存中操做,json-->py object;
json.dump(),將json編碼序列化存入文件,py object-->file;
json.load(),從文件讀取數據,將json編碼反序列化,file-->py object;
序列化牽涉到到字符操做、字節操做、編碼操做,查看dumps源碼;
json是字符編碼;
中文,要注意一個原則,用什麼編碼寫的用什麼編碼打開;
通常json編碼的數據不多落地,數據都是經過網絡傳輸,傳輸的時候,要考慮壓縮它;
本質上來講,它就是個文本,是個字符串;
json很簡單,幾乎全部語言編程都支持json,應用範圍十分普遍;
例:
import json
d = {'name':'tom','age':18,'interest':['music','movie'],'test':True,'test2':None}
j = json.dumps(d)
print(j)
d1 = json.loads(j)
print(d1)
注:
運行結果:
{"name": "tom", "age": 18, "interest": ["music", "movie"], "test": true, "test2": null}
{'name': 'tom', 'age': 18, 'interest': ['music', 'movie'], 'test': True, 'test2': None}
例:
In [6]: class AA:
...: pass
...:
In [7]: json.dumps(AA()) #不可序列化
---------------------------------------------------------------------------
TypeError
……
TypeError: <__main__.AA object at 0x7f8cf9f84978> is not JSON serializable
In [8]: class AA:
...: def ser(self):
...: return 'AA'
...:
In [9]: json.dumps(AA().ser()) #序列化方法,方法要本身實現,把要返回的值收集好
Out[9]: '"AA"'
第三方庫;
是一個基於二進制,高效的對象序列化類庫,可用於跨語言通信;
它能夠像json那樣 ,在許多語言之間交換結構對象,但它比json更快速也更輕巧;
支持python、ruby、java、c/c++等衆多語言,宣稱比google protocol buffers還要快4倍;
兼容json和pickle;
https://msgpack.org/
注:
27bytes-->18bytes
82,A7,C3等均爲十六進制,跳過ascii(0-127);
]$ pip install msgpack-python
Collecting msgpack-python
Downloading https://mirrors.aliyun.com/pypi/packages/8a/20/6eca772d1a5830336f84aca1d8198e5a3f4715cd1c7fc36d3cc7f7185091/msgpack-python-0.5.6.tar.gz (138kB)
……
經常使用方法:
import msgpack
msgpack.packb(),同msgpack.dumps(),序列化對象,dumps是用來兼容json和pickle;
msgpack.unpackb(),同msgpack.loads(),反序列化對象,loads是用來兼容json和pickle;
msgpack.pack(),同msgpack.dump(),序列化對象保存到文件對象,用dump來兼容;
msgpack.unpack(),同msgpack.load(),反序列化對象保存到文件對象,用load來兼容;
msgpack簡單易用,高效壓縮,支持語言豐富,用它序列化是一種很好的選擇;
例:
import msgpack
import json
js = '{"person":[{"name":"tom","age":18},{"name":"jerry","age":16}],"total":2}'
d = json.loads(js)
print(type(d))
print(d)
print()
msg = msgpack.dumps(d)
print(type(msg))
print(len(msg))
print(msg)
print()
bts = msgpack.loads(msg,encoding='utf-8')
print(type(bts))
print(bts)
注:
運行結果:
<class 'dict'>
{'person': [{'name': 'tom', 'age': 18}, {'name': 'jerry', 'age': 16}], 'total': 2}
<class 'bytes'>
48
b'\x82\xa6person\x92\x82\xa4name\xa3tom\xa3age\x12\x82\xa4name\xa5jerry\xa3age\x10\xa5total\x02'
<class 'dict'>
{'person': [{'name': 'tom', 'age': 18}, {'name': 'jerry', 'age': 16}], 'total': 2}
長度print(len(msg))與msgpack.org中Try的結果對比: