zoukankan      html  css  js  c++  java
  • 【转】python中json.loads与eval的区别

    JSON有两种结构:

    • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
    • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

    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中的对象,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与eval区别有两点:

    1、json.loads与eval都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。

    2、json不认单引号,json中的字符串需要用双引号包起来

  • 相关阅读:
    设计模式 ( 十七) 状态模式State(对象行为型)
    Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总
    Web服务器及Web应用服务器
    阮一峰的网络日志
    双击退出的实现
    完成3DM以后的总结(2).Xutils的简单使用
    完成3DM以后的总结(1).PullToRefresh
    软考之路之j2se总结
    2013-2014年终总结
    牛腩新闻发布系统之获取IP
  • 原文地址:https://www.cnblogs.com/landhu/p/5856882.html
Copyright © 2011-2022 走看看