最近在学ES,往里面灌数据,ES默认格式是json,因此需要用到去处理json格式。东西很简单,大家一起来学一学。
一、Json简介
JSON( ) 是一种轻量级的数据交换格式。它基于( ECMA-262 3rd – 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, , Perl, 等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
它的格式一般是这样的:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
例如下面这样:
{"b": "Hello", "c": null, "a": true}
它的值可以是双引号括起来的字符串()、数值()、true、false、 null、对象()或者数组(array)。这些结构可以嵌套。
值(value)可以是双引号括起来的字符串()、数值()、true、false、 null、对象()或者数组(array)。这些结构可以嵌套。
二、使用编码和解析Json
内置了json包来帮助我们完成对json的操作。
将的字典结构导出到json使用json.dumps(),将json读成的字典结构,使用json.loads()。
如果不是针对操作而是对文件操作,分别使用json.load()函数和json.dump()函数。
import json data = { 'name' : 'ACME', 'shares' : 100, 'price' : 542.23 } json_str = json.dumps(data) data = json.loads(json_str) # Writing JSON data to file with open('data.json', 'w') as f: json.dump(data, f) # Reading data back with open('data.json', 'r') as f: data = json.load(f)
默认的类型对应如下:
dict
array
list
(int)
int, long
(real)
float
true
True
false
False
null
None
三、其他数据类型与Json之间的编码和解码
一般来说,对json的解析是list或dict之间的操作,如果需要其他类型与json之间转换,就需要参数。先定义一个类,将类的字典初始化成json的key-value键值对。这样,json的参数就变成了类的属性。
将一个JSON字典转换为一个对象
>>> class JSONObject: ... def __init__(self, d): ... self.__dict__ = d ... >>> >>> data = json.loads(s, object_hook=JSONObject) >>> data.name 'ACME' >>> data.shares 50 >>> data.price 490.1
还可以通过指定“函数”来进行转换。
用函数来指定序列化的方法,即将对象的“属性-值”对变成字典对,函数返回一个字典,然后json.dumps会格式化这个字典。
如果是通过函数将json变成对象,首先获得类名,然后通过来创建一个对象(不调用初始化函数),然后将json字典的各个属性赋给对象。
使用函数指定json转换方式
def serialize_instance(obj): d = { '__classname__' : type(obj).__name__ } d.update(vars(obj)) return d # Dictionary mapping names to known classes classes = { 'Point' : Point } def unserialize_object(d): clsname = d.pop('__classname__', None) if clsname: cls = classes[clsname] obj = cls.__new__(cls) # Make instance without calling __init__ for key, value in d.items(): setattr(obj, key, value) return obj else: return d
使用方法如下:
>>> p = Point(2,3) >>> s = json.dumps(p, default=serialize_instance) >>> s '{"__classname__": "Point", "y": 3, "x": 2}' >>> a = json.loads(s, object_hook=unserialize_object) >>> a >>> a.x 2 >>> a.y 3
参考文献:
加入IP合伙人(站长加盟) | 全面包装你的品牌,搭建一个全自动交付的网赚资源独立站 | 晴天实测8个月运营已稳定月入3W+
限时特惠:本站每日持续更新海量内部创业教程,一年会员只需98元,全站资源免费无限制下载点击查看会员权益
站长微信: qtw123cn
