在上一篇文章《 学习基础知识:如何在SQLite中使用JSON》中,我们深入探讨了SQLite的基本JSON函数及其功能。我们探讨了在 SQLite 数据库中将 JSON 用作非结构化数据。至关重要的是,我们详细介绍了一些必要的SQLite JSON函数,讨论了它们在数据存储和检索中的作用,然后是实际的SQL查询示例。对如何在SQLite中使用JSON数据的基本理解为高级探索该主题奠定了基础。

让我们开始吧!

通过充分掌握SQLite中的JSON处理来集成SQL和NoSQL能力

提高您对 SQLite 的 JSON 处理功能的了解,结合了 SQL 和 NoSQL 的优点,为管理混合数据格式提供了高效的一体化解决方案。SQLite中的JSON数据支持使SQLite成为非结构化数据的强大引擎,类似于 MongoDB等数据库。

SQLite的高级JSON集成将JSON的灵活性和SQLite的健壮性结合在一起,非常适合当今的数据密集型应用程序。SQLite的JSON功能不仅仅是存储和检索数据。它们允许对 JSON 数据进行类似 SQL 的操作,从而在结构化和非结构化数据管理之间架起一座桥梁。

本指南重点介绍如何通过动手 SQL 查询示例来归档 SQLite 的 JSON 函数的实用技能集。每个部分都旨在提高您的理解力,并让您在SQLite中实际的JSON数据操作中抢占先机。

到最后,您将掌握 SQLite 中可用的 JSON 数据处理工具集,以处理任何 JSON 数据结构。您将学习如何应用索引、使用路径表达式进行查询、过滤甚至验证数据——这是使用 SQLite 中的 JSON 函数在结构化环境中处理动态数据的基本任务。

1. 如何在SQLite中集成JSON

SQLite内置的JSON函数在集成 JSON 和SQLite方面发挥着关键作用。从 2022 年 2 月 22 日发布的 SQLite 版本 3.38.0  开始,默认情况下包含 JSON 函数,而在此之前它们是扩展sqlite.org/json1.html#compiling_in_json_support“ spellcheck=”false“>设置编译时选项,以防需要禁用它们。

您可以使用简单的插入 SQL 查询将 JSON 数据导入 SQLite。或者,您也可以利用第三方工具或脚本技术来批量 导入广泛的 JSON 数据集 。要提取 JSON 数据,您可以利用 json_extract() 函数从 JSON 数据列中获取链接到特定键的值。

2. 利用 SQLite JSON 函数进行高级 JSON 解码和 SQL 查询

在本节中,我们将探讨高级 JSON 函数及其在 SQLite 中的功能,并为每个函数使用 SQL 查询示例。在这篇博文中,我们将使用示例生成的 JSON 数据(名为 movie)作为参考,用作检查数据:

This is a sample JSON file opened in Dadroit JSON Viewer, to be used throughout the JSON SQLite tutorial post about a movie record, consisting of these fields: "ID", "Name", "Year", "Genre" and "Cast" as arrays, "Director", "Runtime", and "Rate”.

在Dadroit JSON Generator中生成并在Dadroit JSON Viewer中打开的示例JSON文件

您可以将数据插入到名为 movie 的表中,其中包含一个名为 data 的字段,并从现在开始针对它运行这些示例查询。在下面的查询中,我们将使用 JSON 函数的输入文本,以便直接说明函数,然后我们将从第 3 节开始返回到数据库中插入的数据。

为了简单起见,在此示例中,我们将使用第一个 JSON 数据的更简单版本:

 
{ "Name": "Naked of Truth", "Year": 1979, "Director": "Ellynn O'Brien", "Producer": "Kayley Byron Tutt", "Runtime": 183, "Rate": 8.0, "Description": "Donec pretium nec dolor in auctor." }

json_error_position() SQLite中使用函数进行错误检测

json_error_position() 函数可用于检测 JSON 数据语法中的任何错误。如果输入字符串是有效的 JSON,它将返回 0,否则,它将返回第一个错误的字符位置。

例如,如果您有一个损坏的 JSON 字符串作为此函数的输入,如下所示:

 

SELECT
    json_error_position ( '{"Name":"Naked of Truth","Year":1979,' ) AS err_position

运行此查询的结果将是发生的错误语法的位置,在本例中为末尾缺少“}”的位置:

error_position
38

在SQLite中将JSON对象与 json_patch() 函数合并

json_patch() 函数合并了 2 个 JSON 对象,允许添加、修改和删除 JSON 对象。

例如,此查询会将 2 个 JSON 输入合并为 1 个 JSON:

 

SELECT
    json_patch ( '{"Name":"Naked of Truth"}', '{"Year": 2011}' ) AS patched_json;

结果将是这样的,一个由两个字段构造的 JSON 对象:

patched_json
{“Name”:“Naked of Truth”,“Year”:2011}

使用 json_set() SQLite 中的函数操作 JSON 字段

json_set()将 JSON 字符串作为其第一个参数,后跟零对或多对路径/值参数。结果将是一个 JSON 字符串,该字符串是通过根据提供的路径和值对添加或替换值创建的。

例如,在上一个查询的 JSON 数据的基础上,如果要将字段追 Director 加到 JSON 数据,可以编写如下所示的查询:

 

SELECT
    json_set ( '{"Name":"Naked of Truth","Year":2011}', '$.Director', 'Ellynn OBrien' ) AS json_data;

结果将是这样的:

json_data
{“Name”:“Naked of Truth”,“Year”:2011,“Director”:“Ellynn OBrien”}

json_quote() SQLite中的函数

json_quote() 函数是一个简单的函数,它只是用双引号将输入值括起来,使其成为有效的 JSON 字符串。下面是一个简单的查询示例:

 

SELECT
    json_quote ( 'Naked Of Truth' ) AS valid_json_string;

结果将是这样的:

valid_json_string
“赤裸裸的真相”

json_group_object()如何在SQLite中使用JSONjson_group_array()函数进行聚合

对于SQLite中的这组JSON函数,我们需要与前面的示例进行比较,扩展示例JSON数据,以易于理解的方式演示每个函数的用例0}

{“ID”: 2, “Name”: “The Obsessed’s Fairy”, “Year”: 1972, “Genre”: [“Adventure”], “Director”: “Susanne Uriel Lorimer”, “Cast”: [“Dacy Dex Elsa”, “Matilde Kenton Collins”], “Runtime”: 98, “Rate”: 9.5} {“ID”: 3, “Name”: “Last in the Kiss”, “Year”: 1965, “Genre”: [“History”, “Animation”], “Director”: “Simone Mikey Bryn”, “Cast”: [“Margery Maximilianus Shirk”,“Harri Garwood Michelle”], “Runtime”: 106, “Rate”: 4.1}

json_group_array()使用 SQL 查询示例的聚合函数

json_group_array() 函数类似于 SQLite 中的任何其他聚合函数,将多行数据分组到单个 JSON 数组中。

例如,此查询将返回一个 JSON 数组,其中包含 Rate 大于 6 的所有电影名称:

 

SELECT
    json_group_array ( json_extract ( data, '$.Name' ) ) AS movie_names
FROM
    movie
WHERE
    json_extract ( data, '$.Rate' ) > 6

结果将是这样的:

movie_names
[《被遗忘在星球上》、《痴迷的仙女》]

json_group_object()使用 SQL 查询示例的 JSON 函数

json_group_object() 函数通过将查询的两列分组来创建一个 JSON 对象,其中第一列用作键,第二列用作值

例如,此查询将返回一个 JSON 对象,其中每个字段的名称都是电影的 ID,如果 movie Rate 大于 6,则该字段的值是相应的 Name,这将排除最后一部电影:

 

SELECT
    json_group_object ( json_extract ( Data, '$.ID' ), json_extract ( Data, '$.Name' ) ) AS movie_rates
FROM
    movie
WHERE
    json_extract ( Data, '$.Rate' ) > 5

结果将是这样的,一个由第一部和第二部电影的 ID 和 Name 组成的 JSON 对象,因为它们的 ID 和名称大于 Rate 5:

movie_rates
{“1”: “被遗忘在星球上”,“2”:“痴迷的仙女”}

json_each() json_tree() SQLite中使用表值函数解析JSON数据

SQLite提供了两个强大的 表值 函数来处理JSON数据, json_each() 以及 json_tree().它们有带和不带 path 参数的变体,允许您在不同深度与 JSON 进行交互。

假设这是您在 SQLite 数据库的 movie 表的数据字段中插入的唯一 JSON 值,让我们开始解释它的聚合函数:

数据
{ “ID”: 1, “Name”: “Forgotten in the Planet”, “Year”: 1970, “Genre”: [“Comedy”, “Crime”], “Director”: “Henrie Randell Githens”, “Cast”: [“Adrian Gratianna”, “Tani O’Hara”, “Tessie Delisle”], “Runtime”: 90, “Rate”: 7

sqlite.org/json1.html#jeach“ spellcheck=”false“>json_each() 函数将 JSON 对象分解为行,每行表示 JSON 对象中的一个字段,仅通过嵌套 JSON 字段的第 1 级。

例如,此查询将为 JSON 数据中的每个字段返回 8 行:

 

SELECT
    key,
    value,
    type
FROM
    movie,
    json_each ( data )

结果将是这样的,将 JSON 中每个字段的键和值列为一行,如您所见,数组字段 GenreCast 按原样列出,并且函数没有进入它们以列出二级项目:

类型
编号 1 整数
名字 被遗忘在地球上 发短信
1970 整数
类型 [“喜剧”,“犯罪”] 数组
导演 亨利·兰德尔·吉森斯 发短信
[“阿德里安·格拉蒂安娜”,“塔尼·奥哈拉”,“泰西·德莱尔”] 数组
运行 90 整数
7

sqlite.org/json1.html#jtree“ spellcheck=”false“>json_tree() 函数用于完全遍历和解析 JSON 数据,这意味着它将通过所有嵌套级别进入每个字段。该json_tree()函数遍历 JSON,检查它的每个部分,然后为您提供一个表,其中详细说明了它找到的每个元素。

json_tree() 结果显示为一组行,即使是最复杂的嵌套 JSON 数据也能清晰地显示。此表告诉您每个元素的名称、数据类型、值以及它在 JSON 结构中的位置。

因此,此查询将返回几行,描述 JSON 对象的结构,包括嵌套的 Cast 字段:

 

SELECT
    key,
    value,
    type
FROM
    movie,
    json_tree ( data )

上述查询的结果如下所示:

类型
{“ID”:1,“Name”:“被遗忘在星球上”,“Year”:1970,“Genre”:[“Comedy”,“Crime”],“Director”:“Henrie Randell Githens”,“Cast”:[“Adrian Gratianna”,“Tani O’Hara”,“Tessie Delisle”],“Runtime”:90,“Rate”:7.0} 对象
编号 1 整数
名字 被遗忘在地球上 发短信
1970 整数
类型 [“喜剧”,“犯罪”] 数组
0 喜剧 发短信
1 犯罪 发短信
导演 亨利·兰德尔·吉森斯 发短信
[“阿德里安·格拉蒂安娜”,“塔尼·奥哈拉”,“泰西·德莱尔”] 数组
0 阿德里安·格拉蒂安娜 发短信
1 塔尼·奥哈拉 发短信
2 泰西·德莱尔 发短信
运行 90 整数
7 真正

使用 path 参数, json_tree() 可以专注于 JSON 的特定部分

例如,此查询忽略 Cast 字段之外的所有内容,提供此嵌套 JSON 数组的集中视图:

 

SELECT
    key,
    value,
    type
FROM
    movie,
    json_tree ( data, '$.Cast' )

上述查询的结果如下所示:

类型
0 阿德里安·格拉蒂安娜 发短信
1 塔尼·奥哈拉 发短信
2 泰西·德莱尔 发短信

有趣的事实:你有没有注意到 SQLite中JSON官方文档 的URL中的“1”,并想知道它是否有故事?早在 2015 年,当 JSON 支持首次在 SQLite 中发布时,创建者预计“JSON1”只是一系列版本(JSON2、JSON3 等)的开始

因此,“JSON1”中的“1”不仅仅是一个版本指示器,而是成功的标志!

3. 在SQLite中查询任何复杂JSON数据的实用方法

将 SQLite 的 JSON 函数与 SQLite 的内置函数结合使用,可以执行更复杂的数据查询。在这里,您可以看到其中一些示例,包括聚合、筛选和路径表达式。

如本文开头所述,其余所有部分的示例中表中的 movie JSON 数据如下所示:

数据
{“ID”: 1, “Name”: “被遗忘在星球上”, “Year”: 1970, “Genre”: [“Comedy”, “Crime”], “Director”: “Henrie Randell Githens”, “Cast”: [“Adrian Gratianna”, “Tani O’Hara”, “Tessie Delisle”], “Runtime”: 90, “Rate”: 7.0}
{“ID”: 2, “Name”: “The Obsessed’s Fairy”, “Year”: 1972, “Genre”: [“Comedy”, “Adventure”], “Director”: “Susanne Uriel Lorimer”, “Cast”: [“Dacy Dex Elsa”, “Matilde Kenton Collins”], “Runtime”: 98, “Rate”: 9.5}
{“ID”: 3, “Name”: “Last in the Kiss”, “Year”: 1965, “Genre”: [“History”, “Animation”], “Director”: “Simone Mikey Bryn”, “Cast”: [“Margery Maximilianus Shirk”,“Harri Garwood Michelle”], “Runtime”: 106, “Rate”: 4.1}

在SQLite中使用JSON函数创建聚合SQL查询

此方法涉及使用 JSON 函数以及 SQLite 的内置聚合函数对 JSON 数据执行计算。例如,可以使用以下查询计算归类为喜剧的电影的平均运行时间:

 
SELECT AVG( json_extract ( data, '$.Runtime' ) ) AS average_runtime FROM movie AS M, json_each ( json_extract ( M.data, '$.Genre' ) ) AS T WHERE     T.value = 'Comedy';

上述查询的结果将是这样的,因为数据库中有两部喜剧类型的电影,它们的运行时间分别为 90 和 98,因此它们的平均值如下所示:

average_runtime
94

JSON解码和过滤具有多个条件的数据

您可以通过 json_extract() 在 SQL 查询的子句中使用 WHERE SQLite 中的函数来利用该函数进行深入筛选。例如,您可以根据特定条件筛选电影,例如具有两个或更多 Cast 成员且 Rate 高于特定值的电影。

 

SELECT
    json_extract ( data, '$.Name' ) AS movie_name,
    json_extract ( data, '$.Rate' ) AS movie_rate,
    json_array_length ( json_extract ( data, '$.Cast' ) ) AS cast_size
FROM
    movie
WHERE
    json_array_length ( json_extract ( data, '$.Cast' ) ) >= 2
    AND json_extract ( data, '$.Rate' ) > 8;

上述查询的结果如下所示:

movie_name movie_rate cast_size
痴迷的仙女 9

此示例返回某个类型(如“历史”)中所有电影导演的列表moviedirectors

 

SELECT DISTINCT
    json_extract ( data, '$.Director' ) AS movie_director
FROM
    movie,
    json_each ( json_extract ( data, '$.Genre' ) )
WHERE
    value = 'History';

上述查询的结果如下所示:

movie_director
西蒙娜·米奇·布林

4. 如何在SQLite中检查JSON数据的模式

SQLite中JSON数据的模式检查是一种确保数据结构和一致性,改进未来错误处理以及简化复杂数据操作的方法。尽管 SQLite 缺少用于模式验证的内置函数,但您可以使用其 JSON 和 CHECK 函数来实现此目的。

使用 json_type() check() SQLite 函数检查 JSON 结构

json_type() 函数可用于检查 JSON 数据中字段的类型。例如,在 之前创建的电影表的基础上,假设在创建用于存储电影的 JSON 数据的表时,您希望确保每个条目都具有“名称”和“年份”字段,其中“年份”为整数。为此,您可以在表创建中使用 CHECK() 约束 json_type() 和函数:

 
CREATE TABLE movie ( data TEXT CHECK ( json_type ( data, '$.Name' ) IS NOT NULL AND json_type ( data, '$.Year' ) = 'integer' ) );

此处 json_type() 检查 JSON 数据中指定字段的类型、名称和年份。如果新的插入或更新操作尝试添加 Name 不存在或 Year 不是整数的数据,则 CHECK() 约束将失败,并且该操作将被拒绝。这有助于维护电影表中 JSON 数据的数据完整性。

使用 json_valid() SQLite 中的函数验证 JSON 数据

json_valid() 函数从 JSON 标准格式 的角度验证 JSON 数据的有效性,提供一定程度的架构验证。例如,若要在插入之前确保 JSON 数据的完整性,可以应用验证检查,如下所示:

 

INSERT INTO movie ( data ) SELECT
'{"Name":"Naked of Truth","Year":1979}' AS movie_input
WHERE
    json_valid ( movie_input );

在此语句中, json_valid() 检查提供的 JSON 字符串是否有效。如果是,则将数据插入到电影表中,如果不是,则跳过该操作。此保护措施可防止插入格式错误的 JSON 数据。

让我们考虑另一个结合了这两个规则的示例,即电影表创建阶段的约束和 json_valid() 插入中的检查。考虑以下查询:

 

INSERT INTO movie ( data ) SELECT
'{"Year":"1979"}' AS movie_input
WHERE
    json_valid ( movie_input );

此查询的结果将是“CHECK 约束失败”错误消息,因为输入值没有 Name 字段,并且 Year 字段不是整数,因此即使提供的 JSON 数据是有效的 JSON,插入也会失败readthedocs.io/en/stable/“ spellcheck=”false“>JSONschema 库。

5. 如何在SQLite中管理嵌套的JSON数据

在SQLite中导航嵌套和分层的JSON数据可能会带来一些挑战。但是,SQLite的内置JSON函数简化了此过程并使其易于管理。在这里,您可以看到一些在 SQLite 中管理嵌套 JSON 的策略。

使用 SQL 查询展开分层 JSON 数据

SQLite json_each()json_extract() 函数可以帮助您浏览嵌套的 JSON 数据层。请考虑此查询,该查询用于 json_each() 分析数据并 json_extract() 有选择地提取所需信息。

例如,此查询将深入挖掘表中字段中movie每个 JSON 记录data中的 Cast 数组,并列出具有 2 Cast 个以上成员的 movies Cast 数组:

 

SELECT
    key,
    json_extract ( data, '$.Name' ) AS movie_name,
    json_extract ( data, '$.Year' ) AS movie_year,
    json_array_length ( json_extract ( data, '$.Cast' ) ) AS cast_size
FROM
    movie,
    json_each ( data )
WHERE
    type = 'array'
    AND cast_size > 2
GROUP BY
    movie_name;

上述查询的结果如下所示:

关键 movie_name movie_year cast_size
西蒙娜·米奇·布林 被遗忘在地球上 1970 3

通过 SQL 查询浏览 JSON 数组

JSON 对象可以以数组的形式保存重要信息,通过使用 json_tree()json_extract() 组合,您可以遍历这些嵌套数组并从中提取数据fullkey ) AS actor,
json_extract ( data, ‘$.名称’ ) AS movie_name,
json_array_length ( data, ‘$.演员表’ ) AS cast_size

电影
json_tree ( data ) AS je
哪里
( je.type = ‘文本’ )
AND ( je.fullkey LIKE ‘%Cast%’ );“ data-lang=”“>

SELECT
    json_extract ( data, je.fullkey ) AS actor,
    json_extract ( data, '$.Name' ) AS movie_name,
    json_array_length ( data, '$.Cast' ) AS cast_size
FROM
    movie,
    json_tree ( data ) AS je
WHERE
    ( je.type = 'text' )
    AND ( je.fullkey LIKE '%Cast%' );

此查询的结果如下:

演员 movie_name cast_size
阿德里安·格拉蒂安娜 被遗忘在地球上 3
塔尼·奥哈拉 被遗忘在地球上 3
泰西·德莱尔 被遗忘在地球上 3
黛西·德克斯·艾尔莎 痴迷的仙女 2
玛蒂尔德·肯顿·柯林斯 痴迷的仙女 2
玛格丽·马克西米利安努斯·谢克 最后的吻 2
哈里·加伍德·米歇尔 最后的吻 2
阿德里安·格拉蒂安娜 被遗忘在地球上 3
塔尼·奥哈拉 被遗忘在地球上 3
泰西·德莱尔 被遗忘在地球上 3

使用 json_each() SQLite 中的函数展平 JSON 数据

有时,通过扁平化来简化嵌套的 JSON 结构可能是解决针对 JSON 对象的一些复杂查询的实用方法

例如,此查询用于 json_tree() 将 JSON 数据转换为键值对表,完全扁平化,该查询将获取第一个电影记录的每个主要值类型,并遍历数组和对象:

 

SELECT
    jt.fullkey,
    jt.key,
    jt.value
FROM
    movie,
    json_tree ( data ) AS jt
WHERE
    ( jt.key<> '' )
    AND ( jt.type IN ( 'integer', 'text', 'real' ) )
    AND json_extract ( data, '$.ID' ) = 1

此查询的结果如下:

FullKey
$.ID 编号 1
$.名字 名字 被遗忘在地球上
$.年 1970
$

类型[1]

1 犯罪 $.导演 导演 亨利·兰德尔·吉森斯 $.演员[0] 0 阿德里安·格拉蒂安娜 $.演员[1] 1 塔尼·奥哈拉 $.演员[2] 2 泰西·德莱尔 $.运行 运行 90 $.率 7

通过采用这些方法,您可以在 SQLite 中有效地解析、管理和解码 JSON 数据,这在处理复杂的 JSON 数据时非常宝贵。

6. 如何在SQLite中使用索引对JSON数据进行查询优化

在 SQLite 中为 JSON 数据编制索引是优化搜索操作和提高查询性能的有效方法,尤其是对于大型数据集

这种方法背后的原理很简单。SQLite可以利用 索引 快速找到感兴趣的行,而不是执行全表扫描并解析每一行的JSON,这可能会消耗资源。

如何在SQLite中对JSON数据添加SQL索引

让我们考虑一个数据集 movie 的实际示例。例如,如果您经常按 , Name则在此属性上创建索引将是有益的:

 
CREATE INDEX idx_name ON movie ( json_extract ( data, '$.item.Name' ) );

这里,是 data 包含 JSON 数据的列,是 movie 表。该 json_extract() 函数提取 Name 每个 movie的 JSON 数据,SQLite 使用此值创建索引。

运行此查询并建立索引后,SQLite 可以在您通过其 Name.有了idx_name索引,此查询会快得多。因此,在 SQLite 中为 JSON 数据添加索引提供了强大的优化功能,使其成为管理大型 JSON 数据集的有效方法。

如何在SQLite中对JSON数据的多个字段创建一个索引

让我们考虑另一个示例,在该示例中,您可以基于多个字段更频繁地查询特定数据。例如,如果您经常按“名称”和“年份”进行搜索 movies ,则同时创建这些属性的索引将是有益的。在SQLite中,这可以通过在计算表达式上创建索引来完成:

 
CREATE INDEX idx_name_year ON movie ( json_extract ( data, '$.Item.Name' ), json_extract ( data, '$.Item.Year' ) );

同样,建立此索引后,SQLite可以在您按名称和年份查询电影时快速检索数据 SQLite 中的 Json5 支持

引入 JSON5 是为了支持一些与 ECMA 兼容的语法,并使 JSON 更适合用作配置语言。SQLite 在 3.42.0 版中引入了 JSON5 扩展支持。虽然 SQLite 可以读取和解释包含 JSON5 扩展的 JSON 文本,但 SQLite 函数生成的任何 JSON 文本都将严格符合规范 JSON 的定义。以下是 JSON5 扩展添加到 SQLite 中 JSON 支持的一些主要功能。

SQLite JSON 中带有注释的 JSON 对象

JSON5 允许单行 (//…) 和多行 (/…/) 注释。这对于直接在 JSON 数据中添加上下文或解释特别有用。下面是 JSON 对象中的注释示例:

 

/* A
multi-line
comment
in JSON5 */

{ 
  "key": "value" // A single-line comment in JSON5
}

SQLite JSON 中不带引号的对象键

在 JSON5 中,对象键可以是不带引号的标识符,从而简化了 JSON 语法。但是,需要注意的是,这可能会限制与严格遵循 JSON 标准的系统的兼容性。

 
{  key: "value" }

JSON 对象中的多行字符串

JSON5 支持多行字符串,这可以通过转义换行符来实现。这在处理大型字符串或以更具可读性的格式格式化字符串时非常有用。

 
{  key: "This is a \\\\\\\\  multiline string" }

Json5 与 SQLite 中的规范 JSON 验证

在这里,我们将介绍 JSON5 和规范 JSON 对象的完整验证技术,并通过 SQLite 数据库中精确的 SQL 查询示例来解释它们的支持 如果字符串不是格式正确的 JSON 或 JSON5,则此函数将返回非零值。下面是一个示例:

 

SELECT
    json_error_position ( '{ key: "value"}' ) AS error_position;

此查询的结果为 0,表示此处未检测到错误,即使键未加引号,因为这是 JSON5 的有效扩展。

error_position
0

另一方面,要将 JSON5 字符串转换为规范 JSON,您可以使用该 json() 函数。虽然此函数识别并处理 JSON5 输入,但它将仅输出规范 JSON。这允许向后兼容需要规范 JSON 的系统。下面是一个示例:

 

SELECT
    JSON ( '{key: "value"}' ) AS canonical_json;

此查询的结果将是一个规范的 JSON,从 JSON5 格式转换而来,这使得此处引用的键:

canonical_json
{“key”: “值”}

但是,请注意,即使输入是有效的 JSON5,该 json_valid() 函数也将继续为非规范 JSON 的输入报告 false 例如,请考虑以下查询:

 

SELECT
    json_valid ( '{key: "value"}' ) AS valid_json;

此查询的结果为 0,表示这不是有效的 JSON,因为它有一个不带引号的键,这违反了规范的 JSON 格式:

valid_json
{“key”: “值”}

8. 在SQLite中使用JSON时的常见错误和故障排除

在SQLite中处理JSON数据涉及一些常见的陷阱,可以通过更深入地了解特定机制(例如正确使用函数)来避免这些陷阱。以下是一些关键注意事项。

如何在SQLite的JSON解析阶段调试JSON数据中的语法错误

JSON 数据必须格式正确,并遵循 特定的标准语法 才能在 SQLite 数据库中进行解析和处理。如果 JSON 字符串的格式不正确,SQLite 将无法解释它,从而导致错误。例如,您的括号可能不匹配、引号使用不正确或逗号放错位置。

顾名思义, json_valid() SQLite提供了用于验证JSON字符串的函数。 如果输入是格式正确的 JSON 字符串,则函数返回 1,否则返回 0。 json_valid() 下面是一个示例:

 
SELECT json_valid('{"Name":"Naked of Truth","Year":1979}');

如果 JSON 字符串中出现语法错误,该 json_error_position() 函数可用于标识字符串中发生错误的位置:

 
SELECT json_error_position('{"Name":"Naked of Truth","Year":1979}');

查询 JSON 数据时不正确地使用 JSON 函数

滥用JSON函数是另一个常见问题,因此确保对JSON函数及其在SQLite中的用法有深入的了解对于成功处理数据至关重要

SQLite的JSON函数中没有BLOB支持

请务必确保没有尝试在SQLite中将BLOB与JSON函数一起使用,因为SQLite中的所有JSON函数当前都会 引发错误,如果它们的任何参数是BLOB 并且不是有效的JSON作为输入。SQLite目前不支持JSON的任何二进制编码,而这是未来潜在的增强功能。

如何在SQLite中查询JSON数据时进行JSON验证

json() SQLite 中的函数主要用于通过添加引号、转义必要的字符等来强制执行字符串的 JSON 格式。 不正确地使用该json()函数可能会导致缺乏错误捕获和潜在的数据不一致。

但是,它不是为验证 JSON 而设计的。若要验证 JSON 字符串或查找语法错误,请使用前面讨论的 json_valid() and json_error_position() 函数。

结束语

在这份综合指南中,我们介绍了 JSON 和 SQLite 的强大集成,深入了解了这种组合提供的巨大机会。我们首先概述了 SQLite 的 JSON 函数及其详细的用例和 SQL 查询示例。

我们探索了高级查询技术,例如在 SQLite 中处理分层 JSON 数据。该旅程深入探讨了解码和管理 JSON 数据的机制,突出了 SQLite 函数(如 json_each()json_tree())的有用性。我们还讨论了扁平化 JSON 数据以实现高效数据处理的价值。

然后,我们进入了一个经常被忽视的重要领域:通过索引提高性能。这种强大的优化可以大大提高查询性能,并增强 JSON 的 SQLite 体验。然后讨论了新时代的 JSON5 扩展,为您的 JSON 数据格式设置带来了更大的灵活性。

最后,我们解决了一些常见错误和故障排除技巧,以简化您在 SQLite 中使用 JSON 的旅程,加强了正确 JSON 语法和正确使用 SQLite JSON 函数的重要性。

请记住,学习和实验是在SQLite中释放JSON全部潜力的关键。当您将这些技术应用于您的项目时,请务必分享您的经验,以帮助其他人踏上类似的旅程。因此,让我们继续学习并在SQLite中使用JSON突破界限

Comments are closed.