如何将模式匹配用于针对 JSON 或 JSON 行的 SQL 样式查询

Posted

技术标签:

【中文标题】如何将模式匹配用于针对 JSON 或 JSON 行的 SQL 样式查询【英文标题】:How use pattern matching for SQL style queries against JSON or JSON lines 【发布时间】:2021-08-04 02:41:01 【问题描述】:

从JSON 或JSON lines 形式的数据开始,我想使用structural pattern matching 对其进行查询。

例如,在运行 json.load() 之后,我得到一个结构如下的字典:

publications = 
    'location': 'central library',
    'items': [
        'kind': 'book', 'title': 'Python in Aviation',
        'kind': 'magazine', 'title': 'Flying Monthly', 'issues': 15,
        'kind': 'book', 'title': 'Python for Rock Climbers',
        'kind': 'magazine', 'title': 'Weekly Climber', 'issues': 42,        
    ]

我想做的是应用 Python 3.10 的结构模式匹配提取相关数据很多 like 我会用这个 SQL 查询:

SELECT title, issues FROM Publications WHERE kind = "magazine";

【问题讨论】:

【参考方案1】:

映射模式

解决的关键是申请mapping patterns。根据 PEP 634,它们具有以下形式:

mapping_pattern: '' [items_pattern] ''
items_pattern: ','.key_value_pattern+ ','?
key_value_pattern:
    | (literal_pattern | value_pattern) ':' pattern
    | double_star_pattern
double_star_pattern: '**' capture_pattern

在日常语言中,这意味着“编写一个带有花括号的字典,将常量放入您要匹配的值,并放入您要提取的字段的变量。”

解决的例子

使用问题中提供的数据,您将如何翻译请求的 SQL 查询:

for item in publications['items']:
    match item:
        case 'kind': 'magazine', 'title': title, 'issues': issues:
            print(f'title has issues issues on hand')

这会过滤 items 以仅包括杂志。然后它提取 titleissues 字段。这输出:

Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand

【讨论】:

以上是关于如何将模式匹配用于针对 JSON 或 JSON 行的 SQL 样式查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在巨大的 json 文件之间执行最佳模式搜索?

针对 Swagger API 模式验证 JSON

XML 到 JSON 或数组? PHP

如何使用 json 模式文件测试 json 文件

如何组合 Json 模式

jwt_tooll 一款针对JSON Web Tokens的测试工具