Python JSON解析

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数据。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程