json、MessagePack
目录
json:... 1
json的数据类型:... 1
python与json:... 3
json模块:... 4
MessagePack:... 5
java script object notation,js对象标记,是一种轻量级的数据交换格式,它基于ECMAScript(w3c制定的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据;
ECMAScript是标准,json是实现的产品,另ES5、ES6是js产品;
注:
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的结果对比:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。