Python JSON解析
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。在Python中,我们可以使用json
模块来解析JSON数据。
加载JSON数据
使用json
模块的load
函数来加载JSON数据:
import json
data = '{"name": "Bob", "age": 20, "is_student": true}'
json_data = json.loads(data)
print(json_data) # 输出: {'name': 'Bob', 'age': 20, 'is_student': True}
这里的json_data
变量是一个Python字典,但是其中的布尔值true
会被转换成Python中的True
。
如果从文件中读取JSON数据,可以使用json
模块的load
函数:
import json
with open('data.json') as f:
data = json.load(f)
print(data)
导出JSON数据
使用json
模块的dump
函数将Python对象转换为JSON字符串:
import json
data = {'name': 'Bob', 'age': 20, 'is_student': True}
json_data = json.dumps(data)
print(json_data)
输出的json_data
变量是包含JSON数据的字符串。
如果要导出到文件中,可以使用json
模块的dump
函数:
import json
data = {'name': 'Bob', 'age': 20, 'is_student': True}
with open('output.json', 'w') as f:
json.dump(data, f)
访问JSON数据
访问JSON数据的方式类似于Python中的字典或列表:
import json
data = '{"name": "Bob", "age": 20, "is_student": true}'
json_data = json.loads(data)
print(json_data['name']) # 输出: Bob
print(json_data['age']) # 输出: 20
print(json_data['is_student']) # 输出: True
解析嵌套JSON数据
嵌套JSON数据可以通过使用json
模块来解析。例如,下面是一个包含嵌套JSON数据的示例:
import json
data = '''
{
"name": "Bob",
"age": 20,
"is_student": true,
"university": {
"name": "X University",
"location": "USA",
"majors": ["Computer Science", "Math"]
}
}
'''
json_data = json.loads(data)
print(json_data['university']['name']) # 输出: X University
print(json_data['university']['majors'][0]) # 输出: Computer Science
使用JSON Schema验证数据
JSON Schema是一种基于JSON的数据约束规范,可以用来验证JSON数据是否符合规范。使用Python的jsonschema
库可以轻松地使用JSON Schema验证数据。
首先,需要编写一个JSON Schema定义规范。下面是一个例子:
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"is_student": {"type": "boolean"},
"university": {
"type": "object",
"properties": {
"name": {"type": "string"},
"location": {"type": "string"},
"majors": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["name", "location", "majors"]
}
},
"required": ["name", "age", "is_student", "university"]
}
在Python中,可以使用jsonschema
库来加载JSON Schema,并验证数据是否符合规范:
import json
import jsonschema
# 加载JSON Schema规范
with open('schema.json') as f:
schema = json.load(f)
# 加载待验证的数据
with open('data.json') as f:
data = json.load(f)
# 验证数据是否符合规范
jsonschema.validate(data, schema)
如果数据不符合规范,将会抛出jsonschema.exceptions.ValidationError
异常,其中包含详细的错误消息。
自定义JSON解析器
如果要解析的JSON数据不符合标准规范或包含特殊格式,可以使用Python的第三方库来编写自定义JSON解析器。例如,下面是使用pyparsing
库编写的一段示例代码,用于解析含有注释的JSON数据:
from pyparsing import (alphanums, nums, Group, Suppress, ZeroOrMore,
QuotedString, removeQuotes, oneOf, Word, opAssoc,
NoMatch, Forward)
JSON_COMMENT = Forward()
JSON_IDENTIFIER = Word(alphanums + '_$') | QuotedString('"', '\\')
JSON_VALUE = Forward()
JSON_NULL = noMatch = NoMatch()
TRUE = Suppress(oneOf('true True TRUE'))
FALSE = Suppress(oneOf('false False FALSE'))
NULL = Suppress(oneOf('null Null NULL'))
JSON_STRING = QuotedString('"', '\\')
JSON_INTEGER = Word('-' + nums)
JSON_FLOAT = (Word('+' + '-' + nums, nums)
+ '.' + Word(nums) + ZeroOrMore(oneOf('e E') + Word('+-' + nums, nums)))
JSON_OBJECT = Group(Suppress('{') + ZeroOrMore(Group(JSON_COMMENT | JSON_PAIR)) + Suppress('}'))
JSON_ARRAY = Group(Suppress('[') + ZeroOrMore(Group(JSON_COMMENT | JSON_VALUE)) + Suppress(']'))
JSON_PAIR = Group(JSON_COMMENT | JSON_STRING + Suppress(':') + JSON_VALUE)
JSON_VALUE << (JSON_NULL | JSON_COMMENT | JSON_STRING | JSON_FLOAT | JSON_INTEGER
| TRUE.setParseAction(replaceWith(True))
| FALSE.setParseAction(replaceWith(False))
| JSON_OBJECT | JSON_ARRAY)
JSON_COMMENT << Suppress('//') + SkipTo(Suppress('\n') | '\r\n', include=True) | Suppress('/*') + SkipTo('*/', include=True)
def parse_json(json_str):
try:
result = JSON_COMMENT.parseString(json_str, parseAll=True)[0]
except Exception as e:
raise Exception(f"Cannot parse JSON string: {e}")
return result
使用自定义JSON解析器的示例如下:
json_str = '''
{
"name": "Bob",
"age": 20,
"is_student": true, // This is a comment
"university": {
"name": "X University",
"location": "USA",
"majors": [
"Computer Science",
"Math"
]
}
}
'''
json_data = parse_json(json_str)
print(json_data)
输出的json_data
变量是包含解析后的JSON数据的Python字典。
结论
JSON是一种广泛使用的数据交换格式,Python的json
模块提供了方便的JSON数据解析和导出功能。此外,通过使用第三方库,还可以编写自定义的JSON解析器来解析特殊格式的JSON数据。