博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

json python dict dumps loads eval

Posted on 2017-08-04 10:47  bw_0927  阅读(596)  评论(0编辑  收藏  举报

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对象的数据类型转换表
JSONPython
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None
  • python对象转json字符串类型转换表

 

PythonJSON
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']