json不认单引号,json中的字符串需要用双引号包起来。
{
'a': 1
}
Parse error on line 1:
{ 'a': 1}
-----^
Expecting 'STRING', '}'
JSON的key必须是双引号的字符串
JSON 的值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
{
"a": 1
}
正确
http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html
你想读写JSON(JavaScript Object Notation)编码格式的数据。
解决方案
json
模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps()
和 json.loads()
, 要比其他序列化函数库如pickle的接口少得多。 下面演示如何将一个Python数据结构转换为JSON:
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data) //dumps: 把python对象dumps成字符串
下面演示如何将一个JSON编码的字符串转换回一个Python数据结构:
data = json.loads(json_str) //loads: load字符串将其转换成python对象
经过转换后的data,都会被转成unicode版本
{u'price': 542, u'name': u'ACME', u'shares': 100}
即使的你python字典的key不是字符串,是数字,或者是单引号,通过json.dumps(dict)也会将其标准化为字符串格式的key
>>> a = {1:1}
>>> json.dumps(a)
'{"1": 1}'
>>> a = {'1': '1'}
>>> json.dumps(a)
'{"1": "1"}'
http://www.cnblogs.com/landhu/p/5856882.html
eval与json.loads都可以将大部分的JSON串转成python对象,但也有区别:
>>> import json >>> s = '{"one":1,"two":2}' >>> json.loads(s) {u'two': 2, u'one': 1} >>> eval(s) {'two': 2, 'one': 1}
json.loads与eval都能将s转成python中的对象(包括dict和list),json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。
对于普通的数据类型,json.loads和eval都能用,但:
>>> x="[null,true,false,1]"
>>> json.loads(x)
[None, True, False, 1]
>>> eval(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'null' is not define
在遇到特殊类型的时候,eval就不管用了。eval通常用来执行一个字符串表达式,并返回表达式的值。比如:
>>> eval('1+1') 2 >>> json.loads('1+1') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/json/__init__.py", line 338, in loads return _default_decoder.decode(s) File "/usr/lib/python2.7/json/decoder.py", line 368, in decode raise ValueError(errmsg("Extra data", s, end, len(s))) ValueError: Extra data: line 1 column 2 - line 1 column 4 (char 1 - 3)
附:
- json字符串转python对象的数据类型转换表
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
- python对象转json字符串类型转换表
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
需要注意的是:
>>> dct="{'one':1}" >>> json.loads(dct) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/json/__init__.py", line 338, in loads return _default_decoder.decode(s) File "/usr/lib/python2.7/json/decoder.py", line 365, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting property name: line 1 column 2 (char 1)
json不认单引号,json中的字符串需要用双引号包起来。
json.loads(str), 参数str的key必须是双引号的字符串,不能是任何其他值,否则异常
json.loads(json.dumps(pythonDict)): 不论参数pythonDict中的key是何种类型,经过json.dumps后,其key都会被双引号化
>>> a = {1:1}
>>> print json.dumps(a)
{"1": 1}
终上所述,json与eval区别有两点:
1、json.loads与eval都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。
2、json不认单引号,json中的字符串需要用双引号包起来
===========================================
Python自带的Json库会把json文件load成Unicode对象。如果想要变成str对象的话,就要自己去encode。
def byteify(input):
if isinstance(input, dict):
return {byteify(key): byteify(value) for key, value in input.iteritems()}
elif isinstance(input, list):
return [byteify(element) for element in input]
elif isinstance(input, unicode):
return input.encode('utf-8')
else:
return input
这个函数递归的把list和dict里的Unicode对象encode成str。当然,我不觉得这是the right way。使用yaml里的json来代替官方自带的json可能更好。
http://blog.csdn.net/u010670689/article/details/73330394
原因:
查阅以后发现是python写入时候编码都先中间转化成了unicode
>>> import json
>>> import yaml
>>> list_org = ['a', 'b']
>>> list_dump = json.dumps(list_org)
>>> list_dump
'["a", "b"]'
>>> json.loads(list_dump)
[u'a', u'b']
>>> yaml.safe_load(list_dump)
['a', 'b']