JSON 路径表达式 (SQL Server)

适用范围:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics(仅限无服务器 SQL 池)

使用 JSON 路径表达式可引用 JSON 对象的属性。

在调用以下函数时,必须提供路径表达式。

路径表达式的各部分

路径表达式由两部分组成。

  1. 可选的路径模式,其值为 lax 或 strict

  2. 路径 本身。

路径模式

在路径表达式的开头,可以选择指定关键字 laxstrict来声明路径模式。 默认值为 lax

  • 在 lax 模式下,如果路径表达式包含错误,函数将返回空值。 例如,如果请求值 $.name,但 JSON 文本不包含 name 键,函数将返回 null,但不会引发错误

  • 在 strict 模式下,如果路径表达式包含错误,函数将引发错误

以下查询显式指定路径表达式中的 lax 模式。

DECLARE @json NVARCHAR(MAX);
SET @json=N'{ ... }';

SELECT * FROM OPENJSON(@json, N'lax $.info');

路径

在声明可选的路径模式后,请指定路径本身。

  • 美元符号 ($) 表示上下文项。

  • 属性路径是一组路径步幅。 路径步幅可以包含下列元素和运算符。

    • 键名。 例如,$.name$."first name"。 如果键名以美元符号开头或者包含空格或点运算符 (.) 等特殊字符,请为其加上引号。

    • 数组元素。 例如 $.product[3]。 数组从零开始。

    • 点运算符 (.) 指示对象的成员。 例如,在 $.people[1].surname 中,surnamepeople 的子级。

示例

本部分中的示例引用以下 JSON 文本。

{
    "people": [{
        "name": "John",
        "surname": "Doe"
    }, {
        "name": "Jane",
        "surname": null,
        "active": true
    }]
}

下表显示了一些路径表达式示例。

路径表达式
$.people[0].name John
$.people[1] { "name": "Jane", "surname": null, "active": true }
$.people[1].surname Null
$ { "people": [ { "name": "John", "surname": "Doe" },
{ "name": "Jane", "surname": null, "active": true } ] }

内置函数如何处理重复的路径

如果 JSON 文本包含重复属性,例如,同一级别上有两个同名的键,JSON_VALUE 和 JSON_QUERY 函数将仅返回第一个与路径匹配的值。 若要分析包含重复键的 JSON 对象并返回所有值,请使用 OPENJSON,如下面的示例中所示

DECLARE @json NVARCHAR(MAX);
SET @json=N'{"person":{"info":{"name":"John", "name":"Jack"}}}';

SELECT value
  FROM OPENJSON(@json,'$.person.info');

详细了解 SQL Server 和 Azure SQL 数据库中的 JSON

Microsoft 视频

注意

此部分中的某些视频链接在此时可能不起作用。 Microsoft 会将以前在第 9 频道上的内容迁移到新平台。 随着视频迁移到新平台,我们将更新链接。

有关 SQL Server 和 Azure SQL 数据库中内置 JSON 支持的视频介绍,请观看以下视频:

另请参阅

OPENJSON (Transact-SQL)
JSON_VALUE (Transact-SQL)
JSON_QUERY (Transact-SQL)