python种关于json有很多,simplejson,cjson,还有ujson(详细内容可见:http://blog.csdn.net/gzlaiyonghao/article/details/6567408).
cjson模块只支持string/unicode的key
JSON(JavaScript Object Notation)编码格式的数据。
来看看py3,.dump的主函数:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
ensure_ascii比较关键,True代表显示为编码形式,这个一般在中文里面特别不好用,所以建议关掉。
indent代表缩进,sort_keys代表会否按照某些顺序排列
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data) # 编码
json_str
'{"price": 542.23, "shares": 100, "name": "ACME"}'
data = json.loads(json_str) # 解码
data
{'name': 'ACME', 'price': 542.23, 'shares': 100}
# Writing JSON data
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)
还有一种导入、导出的写法(限py3):
open("myfile.json", "w", encoding="utf-8" ).write( json_data )
json_data = open("myfile.json", "r", encoding="utf8").read()
(1)分离器,用来分割。
>>> import json
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
(2)缩进,更好看。
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
}
(3)与StringIO合用。
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
参考:Python中yaml数据格式的使用
load()
import yaml
yaml_str = """
name: 灰蓝
age: 0
job: Tester
"""
with open('user_info.yaml', encoding='utf-8') as file:
data = yaml.load(file) # 为列表类型
结果:{‘job’: ‘Tester’, ‘age’: 0, ‘name’: u’\u7070\u84dd’}
dump()
import yaml
python_obj = {"name": u"灰蓝",
"age": 0,
"job": "Tester"
}
# 内容导出
with open('new_user_info.yaml', mode='w', encoding='utf-8') as file:
yaml.dump(python_obj, file)
输出结果:
age: 0
job: Tester
name: "\u7070\u84DD"
发现在py3中保存成.json见很容易变成:"{\"new\": [\"\u5927\u90fd\u4f1a\u827a\u672f\u535a\u7269\u9986\"
我想直接保存成中文。
with open('data.json', 'w') as f:
json.dump(json.dump(data,ensure_ascii = False), f)
这段代码中ensure_ascii = False
是可以在py3里面打印出中文,而不是编码形式的。但是保存不了。
需要以下的代码:
open('../../data.json', 'w').write(json.dumps(json_data,ensure_ascii = False))
若依旧出现问题,报错:UnicodeEncodeError: 'gbk' codec can't encode character '\u02c6' in position 54928648: illegal multibyte sequence
,可能还需要加上encoding选项,open('../../data.json', 'w',encoding='utf-8')
读入也可以用:
eval(open('../../data.json', "r").read())
.read()读入为字符串的形式,eval可以把字符串变成原来的格式,也就是{}
网上还有用codecs库,好像也是不行的
import codecs
codecs.open('../../data.json', 'w', "utf-8") as f:
json.dump
Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。
Github 地址:https://github.com/dmeranda/demjson
官方地址:http://deron.meranda.us/python/demjson/
import demjson
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
json = demjson.encode(data)
print(json)
[{"a":1,"b":2,"c":3,"d":4,"e":5}]
text = demjson.decode(json)
print (text)
[{'c': 3, 'e': 5, 'b': 2, 'a': 1, 'd': 4}]
.
https://github.com/esnme/ultrajson
>>> import ujson
>>> ujson.dumps([{"key": "value"}, 81, True])
'[{"key":"value"},81,true]'
>>> ujson.loads("""[{"key": "value"}, 81, true]""")
[{u'key': u'value'}, 81, True]
编码encode_html_chars:
>>> ujson.dumps("