初步了解json文件

来自wetab 的AI pro:

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是它使用了类似于编程语言(特别是JavaScript)的习惯。因此,这种格式非常流行在网络应用中用于数据交互。

JSON是由多种类型的值组成:

  1. 对象(Object):对象在JSON中表示为一系列键值对(“key”: value),被大括号 {} 包围。每个键(key)是一个字符串,每个值(value)可以是字符串、数字、数组、真/假值或者另一个对象。
  2. 数组(Array):数组是一系列值(value),被方括号 [] 包围,值之间用逗号分隔。
  3. 值(Value):值可以是字符串、数字、对象、数组、布尔值(true/false)或者 null。

示例 JSON 数据

{
    "person": {
        "name": "John Doe",
        "age": 30,
        "isStudent": false,
        "skills": ["Python", "JavaScript"],
        "address": {
            "street": "123 Elm St",
            "city": "Somewhere"
        }
    }
}

在这个示例中:

  • “person” 是一个对象,包含了五个键值对:nameageisStudentskills, 和 address
  • “skills” 是一个数组,包含了两个字符串值。
  • “address” 是一个嵌套对象,包含了 street 和 city 两个键。

如何使用 Python 处理 JSON

Python 支持 JSON 通过 json 库,允许你解析 JSON 字符串及文件,并可以将内部数据结构变回 JSON 格式。

以下是基于上述 JSON 示例的处理代码:

import json

# JSON 字符串
json_string = '''
{
    "person": {
        "name": "John Doe",
        "age": 30,
        "isStudent": false,
        "skills": ["Python", "JavaScript"],
        "address": {
            "street": "123 Elm St",
            "city": "Somewhere"
        }
    }
}
'''

# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_string)

# 访问数据
name = data['person']['name']
age = data['person']['age']
skills = data['person']['skills']
city = data['person']['address']['city']

print(f"Name: {name}, Age: {age}, City: {city}")
print("Skills:", skills)

# 添加一个新的技能
data['person']['skills'].append("R")

# 将 Python 字典转换回 JSON 字符串
updated_json = json.dumps(data, indent=4)
print("Updated JSON:")
print(updated_json)

这个代码段展示了如何从一个 JSON 字符串读取数据,怎样访问和修改数据,以及如何将修改后的数据写回到 JSON 格式。dumps()方法:将Python对象序列化为JSON字符串。

进一步的,将上面的json_string保存为一个json文件并从文件读取内容,然后将['person']['name']的值改为"Tom",再次保存json文件:

import json

# JSON 字符串
json_string = '''
{
    "person": {
        "name": "John Doe",
        "age": 30,
        "isStudent": false,
        "skills": ["Python", "JavaScript"],
        "address": {
            "street": "123 Elm St",
            "city": "Somewhere"
        }
    }
}
'''

# 将字符串保存到 JSON 文件
with open('data.json', 'w') as file:
    file.write(json_string)

# 从文件读取 JSON 数据
with open('data.json', 'r') as file:
    data = json.load(file)

# 修改name的值
data['person']['name'] = "Tom"

# 将更新后的数据保存回 JSON 文件
with open('data.json', 'w') as file:
    json.dump(data, file, indent=4)

# 打印输出以验证更改
print(json.dumps(data, indent=4))
  • indent=4 表示每一层数据前将插入四个空格作为缩进。这使得生成的 JSON 数据结构清晰,方便人类阅读和调试。如果不设这个参数,上述数据的打印结果是:{"person": {"name": "Tom", "age": 30, "isStudent": false, "skills": ["Python", "JavaScript"], "address": {"street": "123 Elm St", "city": "Somewhere"}}}。设定缩进后:
  • {
        "person": {
            "name": "Tom",
            "age": 30,
            "isStudent": false,
            "skills": [
                "Python",
                "JavaScript"
            ],
            "address": {
                "street": "123 Elm St",
                "city": "Somewhere"
            }
        }
    }

 如果数据文本包含中文,需要注意编码方式的设置

demo:data.json


{
    "人员": {
        "姓名": "张三",
        "年龄": 30,
        "学生": false,
        "技能": ["Python", "JavaScript"],
        "地址": {
            "街道": "五一路38号楼",
            "城市": "某地"
        }
    }
}

 调用的脚本:

# encoding: utf-8
# JSON调用含中文demo

import json
with open('data.json', 'r', encoding='utf-8') as file:   # 使用utf-8编码处理中文
    data = json.load(file)    # 加载数据
    data['人员']['年龄'] = 90   # 修改数据
    file.close()

with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)  # 将数据写回json文件,不使用ascii转义符
    file.close()

with open('data.json', 'r', encoding='utf-8') as file:   # 再次打开文件,验证数据
    data = json.load(file)    # 加载数据
    file.close()
    print(data)   # 打印数据

执行结果:

{'人员': {'姓名': '张三', '年龄': 90, '学生': False, '技能': ['Python', 'JavaScript'], '地址': {'街道': '五一路38号楼', '城市': '某地'}}}

注意,ensure_ascii=False的含义写文件的时候是不使用ascii转义符。ensure_ascii的默认值是True,那么汉字存储为json文件后的显示就不是“人员”、“姓名”这样,而是类似"\u59d3\u540d",如果需要手动修改json文件的内容就会很不方便。

 

json.dumps()和 json.dump()的区别:

json.dumps() 和 json.dump() 是 Python 标准库中 json 模块提供的两个函数,都是用于将 Python 对象序列化为 JSON 格式的字符串。不过,这两个函数在使用上有些不同,主要区别在于它们的输出方式和用途。

  1. json.dumps()

    • 目的:将 Python 对象转换为 JSON 格式的字符串
    • 返回值:返回一个表示 JSON 数据的字符串。
    • 用法示例
      import json
      data = {'key': 'value'}
      json_string = json.dumps(data)
      print(json_string)  # 输出:{"key": "value"}
      
    • 此函数通常用于需要JSON格式的字符串,比如在打印、日志记录或通过网络发送数据等场合。
  2. json.dump()

    • 目的:将 Python 对象转化为 JSON 格式,并将其写入到一个 file-like Object(比如文件对象)中。
    • 返回值:没有返回值,直接将 JSON 数据写入提供的 file-like Object。
    • 用法示例
      import json
      data = {'key': 'value'}
      with open('data.json', 'w') as f:
          json.dump(data, f)
      # 上述代码将 data 字典保存到 data.json 文件中,文件内容为:{"key": "value"}
      
    • 此函数通常用于需要将数据保存到文件中的场合。

总结一下:

  • 使用 json.dumps() 需要将得到的字符串自行处理(比如打印或存储)。
  • 使用 json.dump() 直接将数据写入到文件或其他类文件对象中。

两者在参数设定(如缩进格式 indent,排序 sort_keys 等)方面是类似的,可以根据需要灵活选择。

json.load() 和 json.loads() 的区别: 

json.load() 和 json.loads() 也是 Python 标准库中 json 模块提供的两个函数,用于将 JSON 格式的字符串或从文件中加载出来的 JSON 数据反序列化为 Python 对象。这两个函数的主要区别同样在于它们的输入源和用途。

  1. json.loads()

    • 目的:将 JSON 格式的字符串转换为 Python 的数据结构。
    • 参数:一个 JSON 字符串。
    • 返回值:Python 的数据类型(如字典、列表、字符串、数值等)。
    • 用法示例
      import json
      json_string = '{"key": "value"}'
      data = json.loads(json_string)
      print(data)  # 输出:{'key': 'value'}
      
    • 这个函数通常用于处理内存中的 JSON 字符串,如从网络接口接收的数据。
  2. json.load()

    • 目的:读取一个 file-like Object(文件对象或任何支持文件接口的对象)中的 JSON 数据,转换为 Python 的数据结构。
    • 参数:一个打开的文件对象或者任何类似文件的对象,该对象包含了 JSON 文档内容。
    • 返回值:Python 的数据类型(如字典、列表等)。
    • 用法示例
      import json
      with open('data.json', 'r') as f:
          data = json.load(f)
      print(data)  # 假设 data.json 文件中包含 {"key": "value"},输出:{'key': 'value'}
      
    • 这个函数通常用于从文件中读取 JSON 数据。

总结一下:

  • json.loads() 专用于将 JSON 的字符串解码成 Python 对象。
  • json.load() 专用于读取文件中的 JSON 数据,并将其转换成 Python 对象。

这两个函数都用于从 JSON 数据“加载”或“解码”,但输入的形式不同,json.loads() 输入是字符串,而 json.load() 输入则是文件或文件类对象。

进一步的综合了解二者的区别:

# encoding: utf-8

import json

# dumps()和dump()的区别:

json_dict = {  # python格式的字典
        "人员": {
            "姓名": "张三",
            "年龄": 30,
            "学生": False,
            "技能": ["Python", "JavaScript"],
            "地址": {
                "街道": "五一路38号楼",
                "城市": "某地"
            }
        }
    }


with open('data_obj.json', 'w', encoding='utf-8') as file:
    json.dump(json_dict, file, ensure_ascii=False, indent=4)  # dump():将json格式的python对象(本例是字典)写入json文件
    file.close()

json_str = json.dumps(json_dict, ensure_ascii=False)  # dumps():将python格式的对象(本例是字典)转换成json格式的字符串
with open('data_str.json', 'w', encoding='utf-8') as file:
    json.dump(json_str, file, ensure_ascii=False, indent=4)  # 将json格式的python对象(json格式的字符串)写入json文件
    file.close()

with open('data_obj.json', 'r', encoding='utf-8') as file:
    data = json.load(file)  # 从json文件中加载到的内容,注意这个是用python对象格式存储的
    print("data_obj.json的格式是:", type(data), "\n", "内容为:", data)
    file.close()

with open('data_str.json', 'r', encoding='utf-8') as file:
    data = json.load(file)  # 从json文件中加载到的内容,注意这个是用json格式的字符串格式存储的
    print("data_str.json的格式是:", type(data), "\n", "内容为:", data)
    file.close()
    data_dumped = json.loads(data)  # 从文本还原成python对象
    print("还原后的对象的格式是:", type(data_dumped), "\n", "内容为:", data_dumped)

"""
data_obj.json的格式是: <class 'dict'> 
 内容为: {'人员': {'姓名': '张三', '年龄': 30, '学生': False, '技能': ['Python', 'JavaScript'], '地址': {'街道': '五一路38号楼', '城市': '某地'}}}
data_str.json的格式是: <class 'str'> 
 内容为: {"人员": {"姓名": "张三", "年龄": 30, "学生": false, "技能": ["Python", "JavaScript"], "地址": {"街道": "五一路38号楼", "城市": "某地"}}}
还原后的对象的格式是: <class 'dict'> 
 内容为: {'人员': {'姓名': '张三', '年龄': 30, '学生': False, '技能': ['Python', 'JavaScript'], '地址': {'街道': '五一路38号楼', '城市': '某地'}}}

"""

利用定义变量的方法改变jison的值:

原始json文件的内容如下:

{
    "person": {
        "name": {
            "tom": {
                "phone number": {
                        "first number": ["123456"],
                        "second number": ["234567"]
                }
            },
            "jack": {
                "phone number": {
                        "first number": ["666666"],
                        "second number": ["888888"]
                }
            }
 
        }
    }
 
}

# encoding: utf-8
import json

with open('../JSON/setting.json', 'r', encoding='utf-8') as file:
    json_data = json.load(file)
    print(json.dumps(json_data, indent=4))

tom = json_data["person"]["name"]["tom"]   # 定义变量
tom_1st_phone = tom["phone number"]["first number"]   # 定义变量
print(tom_1st_phone)
tom_1st_phone[0] = '000000'    # 改变变量
print(json.dumps(json_data, indent=4))

with open('../JSON/setting.json', 'w') as file:   # 保存文件
    json.dump(json_data, file, indent=4)

 执行结果:

{
    "person": {
        "name": {
            "tom": {
                "phone number": {
                    "first number": [
                        "123456"
                    ],
                    "second number": [
                        "234567"
                    ]
                }
            },
            "jack": {
                "phone number": {
                    "first number": [
                        "666666"
                    ],
                    "second number": [
                        "888888"
                    ]
                }
            }
        }
    }
}
['123456']
{
    "person": {
        "name": {
            "tom": {
                "phone number": {
                    "first number": [
                        "000000"
                    ],
                    "second number": [
                        "234567"
                    ]
                }
            },
            "jack": {
                "phone number": {
                    "first number": [
                        "666666"
                    ],
                    "second number": [
                        "888888"
                    ]
                }
            }
        }
    }
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值