Python中的字典和json的比较和eval内置方法

Python中的字典,json模块,eval

说到python中的字典真的和json数据很类似,且json被绝大部分各类开发者所使用,而eval和这2者什么关系,下面是我的总结

DICT字典 VS Json

dcit,是python中字典数据类型,有了dict可以很方便的对结构化解析数据,有点像最小化的关系型数据库,是key对于value比如

1
a = {'name': '兔纸', 'class': 'One'} #可用单引号和双引号

json,是数据交换格式,JSON语法是JavaScript对象表示语法的子集,规范是:数据在键值对中,数据由逗号分隔,花括号保存对象,方括号保存数组,且必须要用双引号包裹字符串,这是官方的说明其中有一段是”A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java string.” 本文总结只是涉及python 中dict和json的区别以及转换相关

1
a = {"name": "兔纸", "class": "One"} #只能是双引号

我们看看区别(To Do)

json python-dict
只能用双引号包裹字符串 单引号和双引号都可以包裹字符串
json 可以是这样子[{“name”:x},{“age”:2}] 在python中[{“name”:x},{“age”:2}] 叫列表里面有2个字典的元素
如果python中的字典中都是用双引号来包裹字符串的,json才可以解析 python 可以把json数据直接当成字典或者列表使用
所谓的python的dict和json相互操作转换

python中把字典转换从json格式或者相互操作,这是伪命题:因为python可以直接把json数据拿来用的,那转个毛呢?
比如:我们把{“name”:x},{“age”:2} 这种数据需要写入到文件且要保证这种数据格式,我们希望下次读取可以直接当成字典来用
首先要把这个数据变成字符串然后写到文件中,读取的时候{“name”:x},{“age”:2} 就变成了一个字符串,我们需要把这个数据格式化为字典格式来用
又比如:我们调用外包http接口,对方吐出的json格式数据,但是http 去读取回来 也是一个字符串,我们同样想办法转成字典来操作
这时候就需要python 的默认lib库json,因为json数据格式 python可以直接拿来当字典用,其实是json格式数据和字符串相互转换
一般是用python的lib json,在python2.4中这个模块叫simplejson

这里拿json模块来举例

1
2
3
4
5
6
7
8
9
10
11
12
import json
print([ i for i in dir(json) if not i.startswith('_')]) # 打印出这个json模块下面的方法
['JSONDecoder', 'JSONEncoder', 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
a = '{"name":"Seal","age":99}' #显然这是一个字符串
x = json.loads(a) # 使用json.loads 格式化为json数据或者叫转成字典
type(x)
dict

b = {"name":"Seal","age":99}
y = json.dumps(b) # 使用json.dumps 把一个json格式数据或者叫字典转为字符串
type(y)
str

那python中字典同样可以用单引号的,这个时候则么办呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import json
a = "{'name':'Seal','age':99}" #显然这是一个字符串
x = json.loads(a) # 我们再次使用json模块的loads方法,就会出现下面的错误
'''
ValueError Traceback (most recent call last)
<ipython-input-23-6bb448117314> in <module>()
----> 1 x = json.loads(a)

/usr/lib64/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
336 parse_int is None and parse_float is None and
337 parse_constant is None and object_pairs_hook is None and not kw):
--> 338 return _default_decoder.decode(s)
339 if cls is None:
340 cls = JSONDecoder
/usr/lib64/python2.7/json/decoder.pyc in decode(self, s, _w)
363
364 """
--> 365 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
366 end = _w(s, end).end()
367 if end != len(s):
/usr/lib64/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
379 """
380 try:
--> 381 obj, end = self.scan_once(s, idx)
382 except StopIteration:
383 raise ValueError("No JSON object could be decoded")
ValueError: Expecting property name: line 1 column 2 (char 1)
No JSON object could be decoded
这说明的很明白,没有找到JSON的对象,因为用了单引号 并不是json格式数据了,当然就不能使用json的这个方法了
'''

'''
这时候eval出场了,eval是一个把你输入的字符串进行表达的函数,且还有2个参数是global 和local 全局是局部的属性
说简单点你输入是什么就返回的什么,比如 a="1+2" eval(a) 输出不是"1+2" 而是3,
eval()表达了1+2.在python中1+2 是数学运算所以输出是3,None和布尔是不能用eval()来表达了,
当然比如 a=' ' ,或者 a= '\n' 这种也同样不能被表达,
eval()能做的还有很多,这里不做展开了.有兴趣可以自己度娘一下 "eval()不安全"
'''

a = "{'name':'Seal','age':99}"
y = eval(a)
type(t)
dict

文章目录
  1. 1. Python中的字典,json模块,eval
    1. 1.1. DICT字典 VS Json
    2. 1.2. 所谓的python的dict和json相互操作转换