Python Json格式数据处理
示例:查看和编辑 JSON 文件的 Python 程序
import json
from pprint import pprint
def load_json(file_path):
"""
加载并解析 JSON 文件。
:param file_path: JSON 文件路径
:return: 解析后的 JSON 对象(字典或列表)
"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
return data
except Exception as e:
print(f"Error loading JSON file: {e}")
return None
def save_json(file_path, data):
"""
将 JSON 对象保存到文件中。
:param file_path: JSON 文件路径
:param data: 要保存的 JSON 对象(字典或列表)
"""
try:
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
print(f"JSON file saved successfully to {file_path}")
except Exception as e:
print(f"Error saving JSON file: {e}")
def edit_json(data):
"""
编辑 JSON 数据。
:param data: JSON 对象(字典或列表)
:return: 编辑后的 JSON 对象
"""
pprint(data) # 打印当前数据结构
while True:
key_or_index = input("Enter the key/index you want to edit (or type 'done' to finish editing): ").strip()
if key_or_index.lower() == 'done':
break
if isinstance(data, dict):
if key_or_index in data:
value = input(f"Enter new value for '{key_or_index}': ")
try:
# Try to convert the input string to appropriate data type
value = json.loads(value)
except json.JSONDecodeError:
pass # If it's not valid JSON, keep it as a string
data[key_or_index] = value
else:
print(f"Key '{key_or_index}' not found.")
elif isinstance(data, list):
try:
index = int(key_or_index)
if 0 <= index < len(data):
value = input(f"Enter new value for index [{index}]: ")
try:
# Try to convert the input string to appropriate data type
value = json.loads(value)
except json.JSONDecodeError:
pass # If it's not valid JSON, keep it as a string
data[index] = value
else:
print(f"Index '{index}' out of range.")
except ValueError:
print("Invalid index. Please enter a number.")
pprint(data) # 打印更新后的数据结构
return data
if __name__ == '__main__':
file_path = 'example.json' # 替换为你的 JSON 文件路径
# 加载 JSON 文件
data = load_json(file_path)
if data is None:
exit(1)
# 编辑 JSON 数据
edited_data = edit_json(data)
# 保存修改后的 JSON 文件
save_json(file_path, edited_data)
使用说明
-
加载 JSON 文件:
- 将你想要查看和编辑的 JSON 文件路径赋值给
file_path
变量。 - 运行程序,它会读取并打印出 JSON 文件的内容。
- 将你想要查看和编辑的 JSON 文件路径赋值给
-
编辑 JSON 数据:
- 根据提示输入你要编辑的键(如果是字典)或索引(如果是列表),然后输入新的值。
- 如果你想结束编辑,请输入
done
。
-
保存 JSON 文件:
- 编辑完成后,程序会自动将更改保存回原始文件中。
示例 JSON 文件 (example.json
)
为了演示这个程序的功能,这里提供一个简单的 JSON 文件内容示例:
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Physics"],
"address": {
"street": "123 Main St",
"city": "Wonderland"
}
}
当你运行上述 Python 程序,并按照提示进行操作时,你可以查看这个 JSON 文件的内容,并对其进行编辑,比如修改 name
的值、添加新的课程到 courses
列表中,或者更改 address
下的信息等。最后,所有的更改都会被保存回到 example.json
文件中。
如果出现Error loading JSON file: Extra data: line 2 column 1 (char 4530)怎么办?
出现 Error loading JSON file: Extra data: line 2 column 1 (char 4530)
错误提示,通常意味着在解析 JSON 文件时遇到了多余的、未预期的数据。这可能是由于以下几种原因之一:
-
文件格式不正确:JSON 文件中可能包含了多于一个顶级对象或数组,或者有额外的字符(如注释、多余的逗号等)。
-
文件编码问题:如果文件包含非 UTF-8 编码的字符,可能会导致解析失败。
-
文件损坏:文件传输过程中可能出现错误,导致文件内容被破坏。
-
多余数据:文件中存在超出最后一个有效 JSON 对象之后的数据。
解决方法
1. 检查 JSON 文件格式
确保 JSON 文件只包含单个有效的 JSON 对象或数组。可以使用在线 JSON 验证工具(如 jsonlint.com)来检查和格式化 JSON 文件,以确定是否有格式上的错误。
2. 移除多余的数据
如果你确实需要存储多个 JSON 对象,考虑将它们放入一个数组中,或者每个对象保存为单独的文件。例如:
[
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
]
而不是:
{"name": "Alice", "age": 30}
{"name": "Bob", "age": 25} // 这会导致 'Extra data' 错误
3. 检查文件编码
确保你的 JSON 文件是以 UTF-8 编码保存的,并且没有 BOM(字节顺序标记)。你可以使用文本编辑器(如 Notepad++ 或 VSCode)来更改文件编码。
4. 确认文件完整性
确保文件没有损坏,可以通过重新下载或生成文件来验证这一点。如果你是从网络上获取的文件,请尝试再次获取以确保完整性。
5. 修改 Python 代码以处理多个 JSON 对象
如果你必须处理包含多个独立 JSON 对象的文件,可以逐行读取文件并解析每一行作为单独的 JSON 对象。下面是一个示例代码片段:
import json
def load_multiple_json_objects(file_path):
"""
从文件中加载多个 JSON 对象。
:param file_path: 包含多个 JSON 对象的文件路径
:return: 包含所有解析后的 JSON 对象的列表
"""
objects = []
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
try:
obj = json.loads(line.strip())
objects.append(obj)
except json.JSONDecodeError as e:
print(f"Error decoding JSON object: {e}")
continue
return objects
# 使用上述函数加载多个 JSON 对象
file_path = 'example.json'
objects = load_multiple_json_objects(file_path)
for obj in objects:
pprint(obj)
这种方法假设每个 JSON 对象占一行,你可以解析出来然后按照标准的json格式存储。如果不是这种情况,你可能需要更复杂的逻辑来分割和解析文件内容。