本页介绍了如何使用 Spanner 处理 JSON。
JSON 数据类型是一种用于保存 JSON(JavaScript Object Notation,JavaScript 对象表示法)数据的半结构化数据类型。有关 JSON 格式的规范,请参阅 RFC 7159。
JSON 适合用于为数据稀疏或松散定义或更改架构的数据补充关系架构。但是,查询优化器依赖于关系模型来高效地进行大规模过滤、联接、聚合和排序。通过 JSON 进行查询所需的内置优化较少,并且检查和调整性能的能力也较少。
规格
Spanner JSON 类型存储输入 JSON 文档的标准化表示形式。
- JSON 最多可以嵌套 80 层。
- 不保留空格。
- 不支持注释。含有注释的事务或查询将会失败。
- JSON 对象的成员按字典顺序排序。
- JSON 数组元素将保留其顺序。
- 如果 JSON 对象具有重复的键,则仅保留第一个键。
- 基元类型(字符串、布尔值、数字和 null)保留其类型和值。
- 字符串类型值原样保留。
- 数字类型值会保留,但其文本表示法可能会因标准化过程而发生变化。例如,输入数字 10000 的标准化表示法可能为 1e+4。数字值保留语义如下所示:
- 保留 [INT64_MIN, INT64_MAX] 范围内的有符号整数。
- 保留 [0, UINT64_MAX] 范围内的无符号整数。
- 保留可以进行从字符串到双精度再到字符串的往返处理而不会出现精度损失的双精度值。如果双精度值无法以这种方式往返,则事务或查询会失败。
- 例如,
SELECT JSON '2.2412421353246235436'
失败。 - 起作用的解决方法是
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
,它会返回JSON '2.2412421353246237'
。
- 例如,
- 使用
TO_JSON()
,JSON_OBJECT()
, 和JSON_ARRAY()
用于在 SQL 中构建 JSON 文档的函数。这些函数会实现必要的引号和转义字符。
标准化文档允许的大小上限为 10 MB。
是否可为 NULL
JSON null
值被视为 SQL 非 NULL。
例如:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
编码
JSON 文档必须采用 UTF-8 编码。含有采用其他格式编码的 JSON 文档的事务或查询将返回错误。
创建包含 JSON 列的表
创建表时,可以向表添加 JSON 列。JSON 类型值可以为 null。
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
在现有表中添加和移除 JSON 列
您也可以向现有表添加 JSON 列和从现有表中删除 JSON 列。
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
以下示例展示了如何使用 Spanner 客户端库将名为 VenueDetails
的 JSON
列添加到 Venues
表。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
修改 JSON 数据
以下示例展示了如何使用 Spanner 客户端库更新 JSON
数据。
C++
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
C#
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Go
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
PHP
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Ruby
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
查询 JSON 数据
以下示例展示了如何使用JSON
Spanner 客户端库。
C++
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
C#
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Go
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
PHP
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Ruby
如需了解如何安装和使用 Spanner 客户端库,请参阅 Spanner 客户端库。
如需向 Spanner 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
限制
- 不能在 ORDER BY 中使用 JSON 列。
- JSON 类型列不支持编入索引。但是,可以针对生成的列创建索引,以从 JSON 元素中提取标量值。
在以下示例中,针对生成的列创建了索引 VenueMisc
Details
,用于从 JSON 元素 VenueDetails
中提取标量值。
可修改的 json_path 是采用 JSONPath 格式的 STRING 值。
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
DateOpened DATE,
VenueDetails JSON,
Details STRING(MAX) AS (JSON_VALUE(VenueDetails, json_path)) STORED
) PRIMARY KEY(VenueId);
CREATE INDEX VenueMisc ON Venues(Details);