跳到主要内容
跳到主要内容

JSON 函数

以下是对 ClickHouse 文档文本的中文翻译,遵循了提交时设置的所有规则:

有两组用于解析 JSON 的函数:

simpleJSON (visitParam) 函数

ClickHouse 拥有用于简化 JSON 的特殊函数。所有这些 JSON 函数都是基于对 JSON 可能是什么的强假设。它们尽量做到尽可能少地处理,以便快速完成任务。

所做的假设如下:

  1. 字段名(函数参数)必须是常量。
  2. 字段名以某种方式在 JSON 中规范编码。例如:simpleJSONHas('{"abc":"def"}', 'abc') = 1,但 simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0
  3. 在任何嵌套级别不加区分地搜索字段。如果有多个匹配字段,则使用第一个出现的字段。
  4. JSON 中的字符串字面值外部不得有空格字符。

simpleJSONHas

检查是否存在名为 field_name 的字段。结果为 UInt8

语法

别名:visitParamHas

参数

返回值

  • 如果字段存在,返回 1,否则返回 0UInt8

示例

查询:

结果:

simpleJSONExtractUInt

从名为 field_name 的字段的值中解析 UInt64。如果这是一个字符串字段,它会尝试从字符串的开头解析一个数字。如果字段不存在,或字段存在但不包含数字,则返回 0

语法

别名:visitParamExtractUInt

参数

返回值

  • 如果字段存在且包含数字,则返回解析出的数字,其他情况返回 0UInt64

示例

查询:

结果:

simpleJSONExtractInt

从名为 field_name 的字段的值中解析 Int64。如果这是一个字符串字段,它会尝试从字符串的开头解析一个数字。如果字段不存在,或字段存在但不包含数字,则返回 0

语法

别名:visitParamExtractInt

参数

返回值

  • 如果字段存在且包含数字,则返回解析出的数字,其他情况返回 0Int64

示例

查询:

结果:

simpleJSONExtractFloat

从名为 field_name 的字段的值中解析 Float64。如果这是一个字符串字段,它会尝试从字符串的开头解析一个数字。如果字段不存在,或字段存在但不包含数字,则返回 0

语法

别名:visitParamExtractFloat

参数

返回值

  • 如果字段存在且包含数字,则返回解析出的数字,其他情况返回 0Float64

示例

查询:

结果:

simpleJSONExtractBool

从名为 field_name 的字段的值中解析真/假值。结果为 UInt8

语法

别名:visitParamExtractBool

参数

返回值

如果字段的值为 true,则返回 1,否则返回 0。这意味着此功能将返回 0,包括(而不仅仅是)以下情况:

  • 字段不存在。
  • 字段以字符串形式包含 true,例如:{"field":"true"}
  • 字段以数值形式包含 1

示例

查询:

结果:

simpleJSONExtractRaw

将名为 field_name 的字段的值作为 String 返回,包括分隔符。

语法

别名:visitParamExtractRaw

参数

返回值

  • 如果字段存在,返回字段的值(包括分隔符)作为字符串,否则返回空字符串。 String

示例

查询:

结果:

simpleJSONExtractString

从名为 field_name 的字段的值中解析用双引号括起来的 String

语法

别名:visitParamExtractString

参数

返回值

  • 返回字段的未转义值作为字符串,包括分隔符。如果字段不包含用双引号括起来的字符串、如果解转义失败,或字段不存在,则返回空字符串。 String

实现细节

当前不支持格式为 \uXXXX\uYYYY 的代码点,这些代码点不是来自基本多语言平面(它们被转换为 CESU-8,而不是 UTF-8)。

示例

查询:

结果:

JSONExtract 函数

以下函数基于 simdjson,旨在处理更复杂的 JSON 解析需求。

isValidJSON

检查传递的字符串是否有效 JSON。

语法

示例

JSONHas

如果值存在于 JSON 文档中,将返回 1。如果值不存在,将返回 0

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果值存在于 json 中,则返回 1,否则返回 0UInt8

示例

查询:

元素的最小索引为 1。因此,元素 0 不存在。您可以使用整数同时访问 JSON 数组和 JSON 对象。例如:

JSONLength

返回 JSON 数组或 JSON 对象的长度。如果值不存在或类型错误,将返回 0

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回 JSON 数组或 JSON 对象的长度。如果值不存在或类型错误,返回 0UInt64

示例

JSONType

返回 JSON 值的类型。如果值不存在,返回 Null=0(不是通常的 Null,而是 Enum8('Null' = 0, 'String' = 34,...)。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 将值的类型作为字符串返回,若值不存在,则返回 Null=0Enum

示例

JSONExtractUInt

解析 JSON 并提取 UInt 类型的值。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回一个 UInt 值,否则返回 0UInt64

示例

查询:

结果:

JSONExtractInt

解析 JSON 并提取 Int 类型的值。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回 Int 值,否则返回 0Int64

示例

查询:

结果:

JSONExtractFloat

解析 JSON 并提取 Float 类型的值。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回 Float 值,否则返回 0Float64

示例

查询:

结果:

JSONExtractBool

解析 JSON 并提取布尔值。如果值不存在或类型错误,将返回 0

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回布尔值,否则返回 0Bool

示例

查询:

结果:

JSONExtractString

解析 JSON 并提取字符串。此函数类似于 visitParamExtractString 函数。如果值不存在或类型错误,将返回空字符串。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回 json 中的未转义字符串。如果解转义失败、值不存在或类型错误,则返回空字符串。 String

示例

JSONExtract

解析 JSON 并提取给定 ClickHouse 数据类型的值。此函数是前面 JSONExtract<type> 函数的通用版本。意味着:

JSONExtract(..., 'String') 的返回结果与 JSONExtractString() 完全相同, JSONExtract(..., 'Float64') 的返回结果与 JSONExtractFloat() 完全相同。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*
  • return_type — 字符串,指定要提取的值的类型。 String

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,返回指定返回类型的值,否则返回 0Null 或根据指定返回类型返回空字符串。 UInt64Int64Float64BoolString

示例

引用通过多个 indices_or_keys 参数传递的嵌套值:

结果:

JSONExtractKeysAndValues

解析 JSON 中的键值对,其中值为指定的 ClickHouse 数据类型。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*
  • value_type — 字符串,指定要提取的值的类型。 String

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回解析后的键值对数组。 Array(Tuple(value_type)).

示例

JSONExtractKeys

解析 JSON 字符串并提取键。

语法

参数

  • jsonString 有效的 JSON。
  • a, b, c... — 指定路径到嵌套 JSON 对象中的内部字段的逗号分隔索引或键。每个参数可以是 String 通过密钥获取字段或 Integer 以获取第 N 个字段(从 1 开始索引,负数从末尾计数)。如果未设置,则整个 JSON 被解析为顶级对象。可选参数。

返回值

示例

查询:

结果:

JSONExtractRaw

将 JSON 的部分返回为未解析的字符串。如果该部分不存在或类型错误,则返回空字符串。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 将 JSON 的部分返回为未解析的字符串。如果该部分不存在或类型错误,则返回空字符串。 String

示例

JSONExtractArrayRaw

返回 JSON 数组的元素,每个元素作为未解析的字符串表示。如果该部分不存在或不是数组,则返回空数组。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一系列零个或多个参数,每一个参数可以是字符串或整数。 String, Int*

indices_or_keys 类型:

  • 字符串 = 通过键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回数组,包含 JSON 数组的元素,每个元素都作为未解析的字符串表示。否则,如果该部分不存在或不是数组,则返回空数组。 Array(String)。

示例

JSONExtractKeysAndValuesRaw

从 JSON 对象中提取原始数据。

语法

参数

  • jsonString 有效的 JSON。
  • p, a, t, h — 逗号分隔的索引或键,指定路径到嵌套 JSON 对象中的内部字段。每个参数可以是 string 通过密钥获取字段或 integer 以获取第 N 个字段(从 1 开始索引,负数从末尾计数)。如果未设置,则整个 JSON 被解析为顶级对象。可选参数。

返回值

  • 包含 ('key', 'value') 元组的数组。两个元组成员都是字符串。 Array(Tuple(String, String))。
  • 如果请求的对象不存在,或输入 JSON 无效,则返回空数组。 Array(Tuple(String, String))。

示例

查询:

结果:

查询:

结果:

查询:

结果:

JSON_EXISTS

如果值存在于 JSON 文档中,将返回 1。如果值不存在,将返回 0

语法

参数

  • json — 有效 JSON 的字符串。 String
  • path — 表示路径的字符串。 String
备注

在 21.11 版本之前,参数顺序是错误的,即 JSON_EXISTS(path, json)

返回值

  • 如果值存在于 JSON 文档中,返回 1,否则返回 0

示例

JSON_QUERY

解析 JSON 并提取值作为 JSON 数组或 JSON 对象。如果值不存在,将返回空字符串。

语法

参数

  • json — 有效 JSON 的字符串。 String
  • path — 表示路径的字符串。 String
备注

在 21.11 版本之前,参数顺序是错误的,即 JSON_EXISTS(path, json)

返回值

  • 将提取的值返回为 JSON 数组或 JSON 对象。否则,如果值不存在,则返回空字符串。 String

示例

查询:

结果:

JSON_VALUE

解析 JSON 并提取值作为 JSON 标量。如果值不存在,则默认返回空字符串。

此函数受以下设置控制:

  • 通过 SET function_json_value_return_type_allow_nullable = true,将返回 NULL。如果值为复杂类型(例如:结构、数组、映射),则默认返回空字符串。
  • 通过 SET function_json_value_return_type_allow_complex = true,将返回复杂值。

语法

参数

  • json — 有效 JSON 的字符串。 String
  • path — 表示路径的字符串。 String
备注

在 21.11 版本之前,参数顺序是错误的,即 JSON_EXISTS(path, json)

返回值

  • 如果存在,则返回提取的值作为 JSON 标量,否则返回空字符串。 String

示例

查询:

结果:

toJSONString

将值序列化为其 JSON 表示形式。支持各种数据类型和嵌套结构。 64 位 整数 或更大(如 UInt64Int128)默认为带引号。 output_format_json_quote_64bit_integers 控制此行为。 特殊值 NaNinf 被替换为 null。启用 output_format_json_quote_denormals 设置以显示它们。 当序列化 Enum 值时,该函数输出其名称。

语法

参数

  • value — 要序列化的值。值可以是任何数据类型。

返回值

  • 值的 JSON 表示形式。 String

示例

第一个示例显示对 Map 的序列化。 第二个示例显示一些特殊值包装成 Tuple

查询:

结果:

另见

JSONArrayLength

返回最外层 JSON 数组中的元素数量。如果输入 JSON 字符串无效,则该函数返回 NULL。

语法

别名:JSON_ARRAY_LENGTH(json)

参数

  • jsonString 有效的 JSON。

返回值

  • 如果 json 是有效的 JSON 数组字符串,则返回数组元素的数量,否则返回 NULL。 Nullable(UInt64)

示例

jsonMergePatch

返回通过合并多个 JSON 对象形成的合并后的 JSON 对象字符串。

语法

参数

  • jsonString 有效的 JSON。

返回值

  • 如果 JSON 对象字符串有效,则返回合并后的 JSON 对象字符串。 String

示例

JSONAllPaths

返回存储在每行 JSON 列中的所有路径的列表。

语法

参数

返回值

示例

JSONAllPathsWithTypes

返回存储在每行 JSON 列中的所有路径及其数据类型的映射。

语法

参数

返回值

示例

JSONDynamicPaths

返回作为独立子列存储在 JSON 列中的动态路径的列表。

语法

参数

返回值

示例

JSONDynamicPathsWithTypes

返回存储为独立子列的动态路径及其类型的映射,在每行的 JSON 列中。

语法

参数

返回值

示例

JSONSharedDataPaths

返回存储在 JSON 列中共享数据结构中的路径列表。

语法

参数

返回值

示例

JSONSharedDataPathsWithTypes

返回存储在共享数据结构中的路径及其类型的映射,在每行的 JSON 列中。

语法

参数

返回值

示例