python:JSON数据格式的转换

在Python中,JSON是一种流行的数据格式,用于系统之间的数据交换。json模块提供了一些函数来处理JSON数据,允许你将Python对象序列化为JSON字符串,以及将JSON字符串反序列化回Python对象。

JSON序列化

JSON序列化是将Python对象转换为JSON格式的过程。这在将数据保存为一种易于传输或存储的格式,并稍后重建回其原始形式时非常有用。

Python提供了json模块来处理JSON序列化和反序列化。我们可以使用这个模块中的json.dumps()方法来进行序列化。

json.dumps()方法

语法:

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

功能:将obj 序列化为 JSON 格式的字符串,使用下面的转换表:

dumps()方法的参数说明

  • skipkeys:如果 skipkeysTrue(默认值:False),会跳过那些不是基本类型(str、int、float、bool、None)的字典的key,而不会引发TypeError
  • ensure_ascii:如果 ensure_asciiTrue(默认值),输出将确保所有传入的非 ASCII 字符都被转义。如果 ensure_asciiFalse,这些字符将按原样输出。
  • check_circular:如果 check_circularFalse(默认值:True),则将跳过对容器类型的循环引用检查,循环引用将导致 RecursionError(或更糟)。
  • allow_nan:如果 allow_nanFalse(默认值:True),则在严格遵循 JSON 规范的情况下,序列化超出范围的浮点值(nan, inf, -inf)将引发 ValueError。如果 allow_nanTrue,则会使用它们的 JavaScript 等价物(NaN, Infinity, -Infinity)。
  • indent:如果 indent 是一个非负整数或字符串,那么 JSON 数组元素和对象成员将会以那个缩进级别进行美化打印。一个缩进级别为0、负数或空字符串(“”)只会插入换行符。使用 None(默认值)将选择最紧凑的表示方式。使用一个正整数缩进,每级会缩进那么多空格。如果 indent 是一个字符串(例如 "\t"),那么该字符串将用于每一级的缩进。
  • separators:如果指定了 separators,它应该是一个 (item_separator, key_separator) 元组。如果 indent 是 None,默认值是 (', ', ': ') ,否则是 (',', ': ')。要获取最紧凑的 JSON 表示形式,你应该指定 (',', ':') 来消除空白字符。
  • default:如果指定了 default,它应该是一个函数,用于处理那些无法被其他方式序列化的对象。这个函数应该返回一个可以被 JSON 编码的版本的对象,或者抛出一个 TypeError。如果没有指定 default,则会抛出 TypeError
  • sort_keys:如果 sort_keysTrue(默认值为False),则字典的输出将按键排序。
  • 示例

    示例:将python字典转JSON字符串

    import json
    
    data = {'name': '张三', 'age': 18, 'score': 98.85, 'passed': True, 'hobby': ['running', 'reading']}
    
    json_string = json.dumps(data)
    print(type(json_string))
    print(json_string)
    

    运行结果:

    从上面输出可以看到,中文是显示的编码。下面的示例中可以通过参数ensure_ascii=False控制将中文显示出来。

    import json
    
    data = {'name': '张三', 'age': 18, 'score': 98.85, 'passed': True, 'hobby': ['running', 'reading']}
    
    json_string = json.dumps(data, ensure_ascii=False)
    print(type(json_string))
    print(json_string)
    

    运行结果:

    示例:将None转换为JSON

    import json
    
    print(json.dumps(None))
    

    运行结果:

    示例:将元组转换为JSON

    import json
    
    print(json.dumps(('good', 'day', 'python')))
    

    运行结果:

    示例:将列表转换为JSON

    import json
    
    data = ['good', 'day', 'python']
    json_string = json.dumps(data)
    print(json_string)
    

    运行结果:

    示例:将字符串转换为JSON

    import json
    
    data = 'hell world'
    json_string = json.dumps(data)
    print(json_string)
    

    运行结果:

    示例:将False转换为JSON

    import json
    
    data = False
    json_string = json.dumps(data)
    print(json_string)
    

    运行结果:

    示例:输出的JSON字典按照key排序

    import json
    
    data = {'c': 0, 'b':0, 'a':0}
    json_string = json.dumps(data, sort_keys=True)
    print(json_string)
    

    运行输出:

    示例:紧凑编码

    import json
    
    data = [1, 2, 3, {'4': 5, '6': 7}]
    json_string = json.dumps(data, separators=(',', ':'))
    print(json_string)
    

    运行输出:

    示例:美化打印

    import json
    
    data = [1, 2, 3, {'4': 5, '6': 7}]
    json_string = json.dumps(data, sort_keys=True, indent=4)
    print(json_string)
    

    运行结果:

    JSON反序列化

    JSON反序列化是将JSON字符串转换回Python对象的过程。这对于读取和处理以JSON格式传输或存储的数据至关重要。

    在Python中,我们可以使用json.loads()方法从字符串中反序列化JSON数据,并使用json.load()方法从文件中反序列化JSON数据。

    json.loads()方法:从JSON字符串中反序列化

    语法

    json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
    

    函数功能
    使用下面转换表将s反序列化为Python对象:

    如果正在反序列化的数据不是有效的JSON文档,将会引发JSONDecodeError

    函数参数说明

  • object_hookobject_hook 是一个可选的函数,它将在解码任何对象字面量(即字典)的结果时被调用。object_hook的返回值将代替该字典使用。这个特性可以用来实现自定义解码器。
  • parse_float:是一个可选的函数,它将在解码每个 JSON 浮点数字符串时被调用。默认情况下,这相当于float(num_str)。这可以用来使用另一个数据类型或解析器来处理 JSON 浮点数(例如decimal.Decimal)。
  • parse_intparse_int 是一个可选的函数,它将在解码每个 JSON 整数字符串时被调用。默认情况下,这相当于int(num_str)。这可以用来使用另一个数据类型或解析器来处理 JSON 整数(例如 float)。
  • parse_constantparse_constant 是一个可选的函数,它将在遇到以下字符串之一时被调用:'-Infinity', 'Infinity', 'NaN'。这可以用来在遇到无效的 JSON 数字时引发异常。
  • 示例1

    import json
    
    json_string = '["foo", {"bar": ["baz", null, 1.0, 2, false, true]}]'
    python_object = json.loads(json_string)
    print(python_object)
    

    运行结果:

    json.load()方法:从文件中反序列化

    语法

    json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
    

    功能:使用下面转换表将 fp(一个支持 .read() 方法的文本文件或包含 JSON 文档的二进制文件)反序列化为 Python 对象。

    方法的参数

  • 说明同上面json.loads()的参数说明。
  • 示例:从文件中反序列化

    提前准备一个data.json文件:

    {
      "姓名": "Tom",
      "年龄":18,
      "是否学生": false,
      "课程": ["English", "Math", "Python"],
      "地址": {"省份": "陕西", "城市": "延安"}
    }
    

    用下面代码反序列化:

    import json
    
    with open('data.json', 'r', encoding='UTF-8') as f:
        python_obj = json.load(f)
        print(python_obj)
    

    运行输出:

    作者:听海边涛声

    物联沃分享整理
    物联沃-IOTWORD物联网 » python:JSON数据格式的转换

    发表回复