关于JSON,XML
JSON和XML都是传输,存储数据的一种格式。各有各的优缺点,可根据应用场景选择适合的。
一.JSON
1、数据格式
JSON的数据格式是将数据使用{}括起来的key-value的形式,类似python中的字典。其中key要求必须是字符串,且必须使用双引号;value可以是字符串,数字,对象,数组等。可使用JSON格式检测工具检查内容是否符合标准。
{"event_list":[{"0":{"nns_id":"ac6192fe0b9d5806bc2cfa3c9a70a00b","nns_ad_id":"185f5f847595d628ceeef79a67be17b1","nns_ad_position_id":"f5c68748bef87c81517169b2f54d1934","nns_ad_show_begin_time":"00:00:00","nns_ad_show_end_time":"23:59:59","nns_ad_show_type":"pertime","nns_ad_position_name":"\u5bb6\u5ead\u7248\u542f\u52a8\u5e7f\u544a","nns_ad_name":"\u542f\u52a8\u52a8\u753b2","nns_begin_date":"2017-12-08 00:00:00","nns_end_date":"2019-03-08 00:00:00","nns_delivery_numbers_restrict":"0","nns_delivery_rule_restrict":"0","nns_delivery_rule_numbers_restrict":"0","nns_delivery_numbers":"0","nns_delivery_numbers_of_rule":"0","nns_create_time":"2017-12-08 13:38:17","nns_modify_time":"2019-01-17 09:54:44","nns_buss_ext":{"nns_map_type":"1","nns_buss_id":"6000002","nns_ext_type":"ad_policy","nns_ext_id":"ac6192fe0b9d5806bc2cfa3c9a70a00b","nns_create_time":"2018-01-16 18:22:12","nns_modify_time":null,"nns_ext_attribute":"","buss_name":"\u67ec\u57d4\u5be8_\u5bb6\u5ead\u7248"}},"nns_ad_position_id":"f5c68748bef87c81517169b2f54d1934","nns_is_vip_closed":"1","nns_is_product_closed":"1","nns_is_force_play":"0","nns_alive_time":"30"}]}
在浏览器中使用jsonviewer解析后展示为:
2、数据解析
在python中可使用标准库中的JSON模块对数据进行处理
json.dump(),json.dumps()可将字符串转化为JSON对象。json.dump()要求传入的参数是文件对象,json.dumps()要求传入参数是字符串;由于python中字典是无序的,可将sort_keys=True将会转换为有序的JSON对象
3、优缺点
优点:格式简单,不同的语言都易于解析
缺点:流行度不如XML,仍在初级使用阶段
二.XML
1、数据格式
将数据用成对标签括起来,类似HTML结构。但与HTML标签不同的是,XML的标签都是用户自定义的;HTML标签是用于页面展示的,XML标签仅用于数据传输和存储
<ad_event_list><ad_pos><is_vip_closed>1</is_vip_closed><is_product_closed>1</is_product_closed><is_force_play>0</is_force_play><ad_pos_id>f5c68748bef87c81517169b2f54d1934</ad_pos_id><alive_time>30</alive_time><policy id="ac6192fe0b9d5806bc2cfa3c9a70a00b"><ad_content_id>185f5f847595d628ceeef79a67be17b1</ad_content_id><start_time>00:00:00</start_time><end_time>23:59:59</end_time><begin_date>2017-12-08 00:00:00</begin_date><end_date>2019-03-08 00:00:00</end_date><buss_ext><buss_id>6000002</buss_id><buss_name>test</buss_name></buss_ext><area_ext><area_code/><area_name/></area_ext></policy></ad_pos></ad_event_list>
在浏览器解析后展示为:
2、数据解析
python标准库中提供了三种方式用于解析XML
2.1:xml.dom:是一次性将xml文件读取在内存中,将XML数据映射到内存中的树结构,之后通过操作DOM树的各个节点实现读写。优点是易用性强,缺点是耗内存。适用于小型文件。
2.2:xml.sax(simple api for xml):是事件驱动型,通过读取标签触发事件调用对应的用户定义函数来实现XML文件读写。优点是边读边解析,内存占用少,缺点是易用性弱,需要用户自定义函数。适用于大型文件,或只需要解析文件片段,或建立自定义对象模型
2.3:xml.etree.ElementTree(简称ET):是xml.dom的一种实现。内存占用小,并易用性强, 是常用的一种XML处理的api。
读:ET.prase(XML文件),返回树对象,可通过树对象.getroot()获得根节点
ET.fromstring(XML字符串),返回树根节点
查找节点:节点A.find(),从节点A的子代节点中查找节点,找到一个就返回,没找到返回none;节点A.findall(),从节点A的子代节点中查找所有指定节点,返回节点列表,没找到返回空列表。
获取指定节点:节点A.getiterator(),从节点A的后代节点中查找节点,找到返回节点列表,没找到返回空列表。
节点操作:节点.text()获得节点内容,节点.tag()返回节点的名称,节点.attrib()返回节点属性,字典格式
如:
xml文件为:
tree_obj=ET.parse("ET_test.xml")
print tree_obj #<xml.etree.ElementTree.ElementTree object at 0x00000000034E75F8>
root=tree_obj.getroot()
ele_policy=root.getiterator("policy")#[<Element 'policy' at 0x340d128>, <Element 'policy' at 0x340d588>]
ele_bussid=root.getiterator("buss_id")#[<Element 'buss_id' at 0x3b0b320>, <Element 'buss_id' at 0x3b0b780>]
print ele_policy[0].getiterator("ad_pos")#[]
find_adpos=root.find("ad_pos")#<Element 'ad_pos' at 0x3cfaeb8>
findall_adpos=root.findall("ad_pos")#[<Element 'ad_pos' at 0x3cfaeb8>, <Element 'ad_pos' at 0x3d47400>]
print root.find("buss_id")#none
新增节点:ET.Element(节点名),若不绑定则为根节点,一个XML文件仅有一个根节点,可使用父节点.append(子节点);ET.SubElement(父节点,新增节点名)
修改节点属性:节点.set(“属性名”,“新的属性值”);节点.attrib={}
XML文件保存:树对象.write(文件名)
修改已存在XML文件:先获取到DOM树–>修改–>将修改后的DOM保存在文件
n=ET.Element("root")
n_1=ET.SubElement(n,"n1")
n_1.attrib={"id":"test1"}
n_1.text="test"
tree=ET.ElementTree(n)
tree.write("creat.xml")
新建XML文件:先创建节点–>节点与DOM树绑定–>DOM保存在文件
tre=ET.parse("creat.xml")
root=tre.getroot()
el=root.getiterator("n1")
el[0].attrib={"id2":"new"}#修改属性
n_3=ET.SubElement(root,"n3")
n_3.text="n3"
tre.write("creat.xml")
3、优缺点
优:流行度广
缺:数据解析麻烦,且客户端服务器端均需大量代码处理