Python数据分析 只要1分钟 教你玩转JSON 全程干货

liftword4个月前 (01-13)技术文章31

Json 简介:

Json,全名 JavaScript Object Notation,JSON(JavaScript Object Notation(记号、标记))是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 (文末有惊喜)

JSON采用完全独立 于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。JSON易于人阅读和编写,同时也易于机器解析和生成。常用于 http 请求中,接口

数据类型

用Python处理json也很简单,Python自带有json模块。可以对python对象与json字符串进行相互转换。

python的常见内置数据类型有dict,tuple等,而在json中,数据类型有object,array等,在相互转换中,类型是一一对应的。在下表中的python数据类型才可以被转为json,集合set、字节byte不能转为json。

Python数据类型

JSON数据类型

说明

dict

object

都用花括号{}表示

list,tuple

array

JSON用中括号[]表示

str

string

JSON用双引号""表示

int,float

number

True

true

False

false

None

null

json模块的主要4个函数。

方法

解释

json.dumps

解析python对象为json字符串

json.dump

解析python对象,输出到json文件

json.loads

解析json字符串为python对象

json.load

输入json文件,解析为python对象

json.dumps

json.dumps方法提供了很多好用的参数可供选择,比较常用的有sort_keys(对dict对象进行排序,我们知道默认dict是无序存放的),skipkeys(对于键不是基本类型Python字典键值对将被过滤),indent(格式化输出用的)等参数。还是举个例子:

Bash
>> python_obj2={"key2": [4, 5, 6], "key1": [1, 2, 3]}
>>> json_str2=json.dumps(python_obj2)
>>> json_str2=json.dumps(python_obj2,sort_keys=True,indent=2)
>>> print json_str2
{
  "key1": [
    
>> python_obj2={"key2": [4, 5, 6], "key1": [1, 2, 3]}
>>> json_str2=json.dumps(python_obj2)
>>> json_str2=json.dumps(python_obj2,sort_keys=True,indent=2)
>>> print json_str2
{
  "key1": [
    1, 
    2, 
    3
  ], 
  "key2": [
    4, 
    5, 
    6
  ]
}
>>> json_str2=json.dumps(python_obj2,sort_keys=False,indent=2)
>>> print json_str2
{
  "key2": [
    4, 
    5, 
    6
  ], 
  "key1": [
    1, 
    2, 
    3
  ]
}

在python中解析python对象为json字符串,使用json.dumps方法。其中indent参数表示缩进,可以优化json输出格式。

Bash
yimport json
# 创建python list对象
obj = [{'a': 1, 'b': {'aa': 11, 'bb': 22}}, {'b': (False,True,None)}]
# 解析python对象,设置缩进
print(json.dumps(obj,indent=4))
Bash
[
    {
        "a": 1,
        "b": {
            "aa": 11,
            "bb": 22
        }
    },
    {
        "b": [
            false,
            true,
            null
        ]
    }
]

注意点:

  • python字符的单引号被转为双引号
  • 关键字False,True,None对应被转为false,true,null
  • 元组被转为数组
  • 解析后的json本质是字符串

在实际的项目开发中,使用到的python对象可能不止内置的对象,还有可能使用如numpy,pandas,datetime等高频使用的库。如下,将numpy的int32类型的1转为json,发现报错TypeError: Object of type int32 is not JSON serializable,这种类型的报错在python对象转json过程中是非常常见的,报错解释是输入的类型不能序列化。

Bash
# 解析python对象,会报错
json.dumps(np.int32(1))
Bash
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Anaconda3\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Anaconda3\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Anaconda3\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Anaconda3\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type int32 is not JSON serializable

该类问题的解决办法有两种,一是在数据源处做类型强制转换,如可以用内置的int方法把numpy的int32转为int。

Bash
# 解析python对象,强制类型转换
json.dumps(int(np.int32(1)))
'1'

另外一种方法更为灵活(推荐),设置json.dumps参数cls,cls参数输入为类,可以重写jsoneEncoder类中的default方法。

Bash
# 自定义类
class MyEncoder(json.JSONEncoder):
    """
    重写json模块JSONEncoder类中的default方法
    """
    def default(self, obj):
        # np整数转为内置int
        if isinstance(obj, np.integer):
            return int(obj)
        else:
            return super(JetEncoder, self).default(obj)
Bash
# 解析python对象,设置cls参数
json.dumps(np.int32(1),cls=MyEncoder)
'1'

第二种方法灵活性更好,可以根据项目情况自定义需要转换的类型,当有多个地方需要转换时,通用性更好。

json.dump

json.dump用于保存python对象为json文件。obj.json文件中会保存解析obj后的json字符串。

Bash
# python list对象
print(obj)
[{'a': 1, 'b': {'aa': 11, 'bb': 22}}, {'b': (False, True, None)}]
# 解析python对象并输出到json文件
with open('obj.json','w') as f:
    json.dump(obj,f)

json.loads

json.loads用于加载json字符串,然后解析成python对象。

Bash
json_str='{"a":1,"b":{"aa":11,"bb":22}}'
# 解析json字符串为python对象
json.loads(json_str)
{'a': 1, 'b': {'aa': 11, 'bb': 22}}

json.load

json.load用于加载json文件,然后解析成python对象。

Bash
# 解析python对象,输出到json文件
with open('obj.json','r') as f:
    print(json.load(f))
[{'a': 1, 'b': {'aa': 11, 'bb': 22}}, {'b': [False, True, None]}]

需要下面的资料的,还有更多课件资源的,请私信我“666”领取!!!

私信我还有更多惊喜哦!!!

相关文章

python字典中如何添加键值对

添加键值对首先定义一个空字典 1>>> dic={}直接对字典中不存在的key进行赋值来添加123>>> dic['name']='zhangsan'>>...

字典操作(键值对) - 看这些就够了

1、初始化:大括号、dict、fromkeys初始化2、访问:单个访问、多个访问 单个访问-->[]、get; 多个访问-->items、keys、values;访问3、编辑:增加、修改、...

Python- 函数 - 传递任意数量的参数

收集任意位置参数:有时,你不会提前知道一个函数需要多少个参数。Python 允许您在参数名称前使用星号 * 收集任意数量的位置参数。这会将所有其他参数打包到一个 Tuples 中。示例:接受任意数量的...

超详细python基础语法(每个都有例子)

以下是Python的一些基础语法:1. 注释:单行注释:使用#符号表示单行注释,注释内容写在#后面,如下所示:```# 这是一条单行注释```多行注释:使用'''或"&...

一文掌握6种Python中常用数据库操作及代码

在数据处理和管理领域,Python作为一种高效、易用的编程语言,拥有丰富的数据库操作模块,可以轻松实现对关系型数据库的数据操作,本文将介绍六种常见的Python数据库操作模块,需要的可以参考下目录一、...

Python 中的字典get()方法和 setdefault()

Python 字典是强大的数据结构,允许使用键值对有效地存储和检索数据。字典提供的最有用的方法之一是 get() 方法。此方法有助于正常处理缺失的 key,避免常见的 KeyError 异常。此外,s...