JSON格式的数据格式广泛使用在各种应用中,比XML格式更轻量级,所以现在很多应用都选择JSON格式保存数据,尤其是需要通过网络传输(如socket传输)数据时,这对于移动应用更具有优势。JSON格式数据比XML格式的数据量更小,所以传输速度更快,也更节省数据流量(省钱),因此,在移动APP应用中,几乎都是采用了JSON格式。
JSON格式的数据可以保存数组和对象。JSON数组用一对中括号'[ ]'将数据括起来;JSON对象用一对大括号'{ }'将数据括起来。本文介绍JSON字符串与字典的互相转换、JSON字符串与类实例互转、JSON与XML互转等知识点。
一、JSON字符串与字典互转实例
import json
#定义一个字典
datadict = {
'name':'Bill',
'company':'Microsoft',
'age':34
}
#定义一个列表
datalist =[20,'names',
{'name':'Bill','age':30,'salary':2000},
{'name':'Chen','age':40,'salary':3000},
{'name':'Ling','age':50,'salary':4000}
]
# 将字典转换为json字符串
jsonstr1 = json.dumps(datadict)
print(jsonstr1)
print('-----------------------')
#输出:{"company": "Microsoft", "name": "Bill", "age": 34}
# 将列表转换为json字符串
jsonstr2 = json.dumps(datalist)
print(jsonstr2) #输出:{"company": "Microsoft", "name": "Bill", "age": 34}
print('-----------------------')
#输出:[20, "names", {"age": 30, "name": "Bill", "salary": 2000}, {"age": 40, "name": "Chen", "salary": 3000}, {"age": 50, "name": "Ling", "salary": 4000}]
# 将JSON字符串转成字典
data = json.loads(jsonstr1)
print(type(data))
print(data)
# 输出字典:{'company': 'Microsoft', 'name': 'Bill', 'age': 34}
# 将JSON字符串转成列表
data = json.loads(jsonstr2)
print(type(data))
print(data)
二、JSON字符串与类实例互转
(一)Json串转为类实例
# 1、用类实例
class Product:
def __init__(self, d):
self.__dict__ = d
# f = open('./files/product.json','r')
# jsonstr = f.read()
jsonstr = '''
{"name":"iPhone9",
"price":9999,
"count":3000
}
'''
my1 = json.loads(jsonstr,object_hook=Product)
print(my1.__dict__)
print('name={}'.format(my1.name))
print('price={}'.format(my1.price))
print('count={}'.format(my1.count))
print('------------------------------')
# 2、用回调函数
def jsontoProduct(d):
return Product(d)
my2 = json.loads(jsonstr,object_hook=jsontoProduct)
print(my2.__dict__)
print('name={}'.format(my2.name))
print('price={}'.format(my2.price))
print('count={}'.format(my2.count))
# f.close()
# 输出:
'''
{'count': 3000, 'price': 9999, 'name': 'iPhone9'}
name=iPhone9
price=9999
count=3000
------------------------------
{'count': 3000, 'price': 9999, 'name': 'iPhone9'}
name=iPhone9
price=9999
count=3000
'''
(二)类实例转成JSON串
class Product:
def __init__(self,name,price,count):
self.name = name
self.price = price
self.count = count
def producttoDict(obj):
return {
'name':obj.name,
'price':obj.price,
'count':obj.count
}
product = Product('特斯拉',30000000,10)
jsonstr = json.dumps(product,default=producttoDict,ensure_ascii=False)
print(jsonstr)
#输出:{"name": "特斯拉", "count": 10, "price": 30000000}
(三)类实例列表与JSON串互转
# f = open('./files/products.json','r',encoding='utf-8')
# jsonstr = f.read()
jsonstr = '''
[
{
"name":"iPhone9",
"price":9999.9,
"count":2000
},
{
"name":"特斯拉",
"price":1000000,
"count":123
}
]
'''
class Product:
def __init__(self, d):
self.__dict__ = d
products = json.loads(jsonstr,object_hook=Product)
for p in products:
print('name={}'.format(p.name))
print('price={}'.format(p.price))
print('count={}'.format(p.count))
print('====================')
# f.close()
def producttoDict(product):
return {
'name':product.name,
'price':product.price,
'count':product.count
}
jsonstr2 = json.dumps(products,default=producttoDict,ensure_ascii=False)
print(jsonstr2)
# 输出:
'''
name=iPhone9
price=9999.9
count=2000
====================
name=特斯拉
price=1000000
count=123
====================
[{"price": 9999.9, "name": "iPhone9", "count": 2000}, {"price": 1000000, "name": "特斯拉", "count": 123}]
'''
三、JSON格式与XML格式互转
import json
import dicttoxml
import xmltodict
# f=open('./files/products.json','r',encoding='utf-8')
# jsonstr = f.read()
jsonstr = '''
[
{
"name":"iPhone9",
"price":9999.9,
"count":2000
},
{
"name":"特斯拉",
"price":1000000,
"count":123
}
]
'''
dicts = json.loads(jsonstr)
# f.close()
print('1、------------------------')
print(dicts)
print('2、------------------------')
xmlstr = dicttoxml.dicttoxml(dicts).decode('utf-8')
print(xmlstr)
print('3、-------------------------')
dict2 = xmltodict.parse(xmlstr) #字典
jsonstr2 = json.dumps(dict2)
print(jsonstr2)
dict3 = json.loads(jsonstr2)
print(type(dict3))
print(dict3)
for li in dict3['root']['item']:
print(li['name']['#text'])
print(li['price']['#text'])
print(li['count']['#text'])
print('-----------------')
# 输出:
'''
1、------------------------
[{'count': 2000, 'price': 9999.9, 'name': 'iPhone9'}, {'count': 123, 'price': 1000000, 'name': '特斯拉'}]
2、------------------------
<?xml version="1.0" encoding="UTF-8" ?>20009999.9iPhone91231000000特斯拉
3、-------------------------
{"root": {"item": [{"@type": "dict", "count": {"@type": "int", "#text": "2000"}, "price": {"@type": "float", "#text": "9999.9"}, "name": {"@type": "str", "#text": "iPhone9"}}, {"@type": "dict", "count": {"@type": "int", "#text": "123"}, "price": {"@type": "int", "#text": "1000000"}, "name": {"@type": "str", "#text": "\u7279\u65af\u62c9"}}]}}
{'root': {'item': [{'@type': 'dict', 'price': {'@type': 'float', '#text': '9999.9'}, 'name': {'@type': 'str', '#text': 'iPhone9'}, 'count': {'@type': 'int', '#text': '2000'}}, {'@type': 'dict', 'price': {'@type': 'int', '#text': '1000000'}, 'name': {'@type': 'str', '#text': '特斯拉'}, 'count': {'@type': 'int', '#text': '123'}}]}}
iPhone9
9999.9
2000
-----------------
特斯拉
1000000
123
-----------------
'''
参考文献:
1、《python从菜鸟到高手》,作者:李宁