百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

sqlite3 支持JSON sqlite3官网下载

liebian365 2024-11-13 13:24 23 浏览 0 评论

简介

在 SQLite 版本 3.38.0 (2022-02-22) 之前,JSON 函数是一个扩展,需要另外编译。本 3.38.0 之后,JSON 函数和运算符默认内置于 SQLite 。


SQLite将JSON存储为普通文本,SQLite(目前)不支持JSON的二进制编码。

默认情况下,SQLite 支持十五个函数和两个运算符来处理 JSON 值

有15个标量函数和运算符。

  1. json(json)
  2. json_array(value1,value2,...)
  3. json_array_length(json) / json_array_length(json,path)
  4. json_extract(json,path,...)
  5. json -> path
  6. json ->> path
  7. json_insert(json,path,value,...)
  8. json_object(label1,value1,...)
  9. json_patch(json1,json2)
  10. json_remove(json,path,...)
  11. json_replace(json,path,value,...)
  12. json_set(json,path,value,...)
  13. json_type(json) / json_type(json,path)
  14. json_valid(json)
  15. json_quote(value)

有两个聚合SQL函数。

  1. json_group_array(value)
  2. json_group_object(name,value)

这两个表值函数是:

  1. json_each(json) / json_each(json,path)
  2. json_tree(json) / json_tree(json,path)

JSON参数

对于接受 JSON 作为其第一个参数的函数,该参数可以是 JSON 对象、数组、数字、字符串或 null。

SQLite 数值和 NULL 值分别被解释为 JSON 数字和空值。

SQLite 文本值可以理解为 JSON 对象、数组或字符串。

如果将不是格式正确的 JSON 对象、数组或字符串的 SQLite 文本值传递给 JSON 函数,该函数会抛出错误。

PATH参数

对于接受PATH参数的函数,PATH必须是正确格式,否则函数将抛出一个错误。

格式正确的 PATH 是一个文本值,它正好以一个 '#39; 字符开头,后跟零个或多个".objectlabel"或"[arrayindex]" 的实例。

数组索引通常是非负整数 N。在这种情况下,所选的数组元素是数组的第 N 个元素,从左侧的零开始。数组索引也可以是“#-N”的形式,在这种情况下,所选元素是右侧的第N个元素。数组的最后一个元素是“#-1”。将“#”字符视为“数组中的元素数”。然后,表达式“#-1”的计算结果为与数组中最后一个条目对应的整数。数组索引有时只是 # 字符很有用,例如,在将值追加到现有 JSON 数组时:

json_set('[0,1,2]','$[#]','new') → '[0,1,2,"new"]'

VALUE参数

对于接受"value“参数(也显示为“value1“和”value2"),这些参数通常被理解为被引用并在结果中成为 JSON 字符串值的文字字符串。

即使输入value字符串看起来像格式正确的JSON,但它们在结果中仍被解释为字符串。

然而,如果一个value参数直接来自另一个 JSON 函数的结果或来自-> 运算符(但不是->> 运算符),则该参数被理解为实际 JSON 并插入完整的 JSON 而不是带引号的字符串。

json()函数

json(X)函数验证其参数X是一个有效的JSON字符串,并返回该JSON字符串的最小化版本(去掉所有不必要的空格)。

如果X不是一个格式正确的JSON字符串,那么这个例程会抛出一个错误。

json('{"this":" is","a":["test"]}')→'{"this":" is","a":["test"]}''

json_array()函数

json_array()SQL函数接受0个或多个参数,并返回一个由这些参数组成的格式正确的JSON数组。

如果json_array()的任何参数是一个BLOB,那么就会抛出一个错误。

json_array(1,2,'3',4) → '[1,2,"3",4]'
json_array('[1,2]') → '["[1,2]"]'
json_array(json_array(1,2)) → '[[1,2]]'
json_array(1,null,'3','[4,5]','{"six":7.7}') → '[1,null,"3","[4,5]","{\"six\":7.7}"]'
json_array(1,null,'3',json('[4,5]'),json('{"six":7.7}')) → '[1,null,"3",[4,5],{"six":7.7}]'

函数json_array_length()

json_array_length(X)函数返回JSON数组X中的元素数,如果X是数组以外的JSON值,则返回0。

X必须是正确是JSON格式。

json_array_length('[1,2,3,4]') → 4
json_array_length('[1,2,3,4]', '#39;) → 4
json_array_length('[1,2,3,4]', '$[2]') → 0
json_array_length('{"one":[1,2,3]}') → 0
json_array_length('{"one":[1,2,3]}', '$.one') → 3
json_array_length('{"one":[1,2,3]}', '$.two') → NULL

json_extract()函数

json_extract(X,P1,P2,...)从X处格式良好的JSON中提取并返回一个或多个值。

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '#39;) → '{"a":2,"c":[4,5,{"f":7}]}'
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c') → '[4,5,{"f":7}]'
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]') → '{"f":7}'
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f') → 7
json_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a') → '[[4,5],2]'
json_extract('{"a":2,"c":[4,5],"f":7}','$.c[#-1]') → 5
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x') → NULL
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a') → '[null,2]'
json_extract('{"a":"xyz"}', '$.a') → 'xyz'
json_extract('{"a":null}', '$.a') → NULL

-> 和 ->> 运算符

从 SQLite 版本 3.38.0 (2022-02-22) 开始, -> 和 ->> 运算符可用于提取 JSON 的子组件。

-> 和 ->> 运算符的 SQLite 实现力求与 MySQL 和 PostgreSQL 兼容。

-> 和 ->> 运算符将 JSON 字符串作为左操作数,将 PATH 表达式或对象字段标签或数组索引作为右操作数。

-> 运算符返回所选子组件的 JSON 表示,如果该子组件不存在,则返回 NULL。

->> 运算符返回代表所选子组件的 SQL TEXT、INTEGER、REAL 或 NULL 值,如果子组件不存在,则返回 NULL。

'{"a":2,"c":[4,5,{"f":7}]}' -> '#39; → '{"a":2,"c":[4,5,{"f":7}]}'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c' → '[4,5,{"f":7}]'
'{"a":2,"c":[4,5,{"f":7}]}' -> 'c' → '[4,5,{"f":7}]'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2]' → '{"f":7}'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2].f' → '7'
'{"a":2,"c":[4,5],"f":7}' -> '$.c[#-1]' → '5'
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.x' → NULL
'[11,22,33,44]' -> 3 → '44'
'[11,22,33,44]' ->> 3 → 44
'{"a":"xyz"}' -> '$.a' → '"xyz"'
'{"a":"xyz"}' ->> '$.a' → 'xyz'
'{"a":null}' -> '$.a' → 'null'
'{"a":null}' ->> '$.a' → NULL

json_insert(),json_replace,and json_set()函数

json_insert()、json_replace和json_set()函数都以一个JSON值作为它们的第一个参数,后面跟着零个或多个路径和值参数对,并返回一个新的JSON字符串,这个字符串是通过更新输入的JSON的路径/值对形成的。

这些函数的不同之处仅在于它们如何处理创建新值和覆盖已有值。

json_insert('[1,2,3,4]','$[#]',99) → '[1,2,3,4,99]'
json_insert('[1,[2,3],4]','$[1][#]',99) → '[1,[2,3,99],4]'

json_insert('{"a":2,"c":4}', '$.a', 99) → '{"a":2,"c":4}'
json_insert('{"a":2,"c":4}', '$.e', 99) → '{"a":2,"c":4,"e":99}'

json_replace('{"a":2,"c":4}', '$.a', 99) → '{"a":99,"c":4}'
json_replace('{"a":2,"c":4}', '$.e', 99) → '{"a":2,"c":4}'

json_set('{"a":2,"c":4}', '$.a', 99) → '{"a":99,"c":4}'
json_set('{"a":2,"c":4}', '$.e', 99) → '{"a":2,"c":4,"e":99}'
json_set('{"a":2,"c":4}', '$.c', '[97,96]') → '{"a":2,"c":"[97,96]"}'
json_set('{"a":2,"c":4}', '$.c', json('[97,96]')) → '{"a":2,"c":[97,96]}'
json_set('{"a":2,"c":4}', '$.c', json_array(97,96)) → '{"a":2,"c":[97,96]}'

json_object()函数

json_object()SQL函数接受0个或多个参数对,并返回一个由这些参数组成的格式良好的JSON对象。

每对参数的第一个参数是标签,第二个参数是值。

如果json_object()的任何参数是一个BLOB,那么就会抛出一个错误。

json_object()函数目前允许重复的标签,不过这一点可能会在未来的改进中改变。

json_object('a',2,'c',4) → '{"a":2,"c":4}'
json_object('a',2,'c','{e:5}') → '{"a":2,"c":"{e:5}"}'
json_object('a',2,'c',json_object('e',5)) → '{"a":2,"c":{"e":5}}'

json_patch()函数

json_patch(T,P)SQL函数运行RFC-7396 MergePatch算法,将补丁P应用于输入T。返回T的补丁副本。

json_patch('{"a":1,"b":2}','{"c":3,"d":4}') → '{"a":1,"b":2,"c":3,"d":4}'
json_patch('{"a":[1,2],"b":2}','{"a":9}') → '{"a":9,"b":2}'
json_patch('{"a":[1,2],"b":2}','{"a":null}') → '{"b":2}'
json_patch('{"a":1,"b":2}','{"a":9,"b":null,"c":8}') → '{"a":9,"c":8}'
json_patch('{"a":{"x":1,"y":2},"b":3}','{"a":{"y":9},"c":8}') → '{"a":{"x":1,"y":9},"b":3,"c":8}'

json_remove()函数

json_remove(X,P,...)函数的第一个参数是一个JSON值,后面是0个或多个路径参数。

json_remove(X,P,...)函数返回一个X参数的副本,其中包含所有由路径参数标识的元素。

选择X中没有的元素的路径会被默默忽略。

从左到右依次进行删除。之前的删除造成的改变会影响后续参数的路径搜索。

如果调用json_remove(X)函数时没有路径参数,那么它将返回重新格式化的输入X,并删除多余的空白。

json_remove('[0,1,2,3,4]','$[2]') → '[0,1,3,4]'
json_remove('[0,1,2,3,4]','$[2]','$[0]') → '[1,3,4]'
json_remove('[0,1,2,3,4]','$[0]','$[2]') → '[1,2,4]'
json_remove('[0,1,2,3,4]','$[#-1]','$[0]') → '[1,2,3]'
json_remove('{"x":25,"y":42}') → '{"x":25,"y":42}'
json_remove('{"x":25,"y":42}','$.z') → '{"x":25,"y":42}'
json_remove('{"x":25,"y":42}','$.y') → '{"x":25}'
json_remove('{"x":25,"y":42}','#39;) → NULL

json_type()函数

json_type(X)函数返回X中最外层元素的 "类型"。json_type(X,P)函数返回X中被路径P选中的元素的 "类型"。json_type()返回的 "类型 "是以下SQL文本值之一。

null,"true","false","integer","real","text","array",或 "object"。如果json_type(X,P)中的路径P选择了一个在X中不存在的元素,那么这个函数返回NULL。

json_type('{“ a”:[2,3.5,true,false,null,“ x”]}')→'对象'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','#39;)→'object'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a')→'array'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [0]')→'integer'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [1]')→'real'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [2]')→'true'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [3]')→'false'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [4]')→'null'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [5]')→'text'
json_type('{“ a”:[2,3.5,true,false,null,“ x”]}','$。a [6]')→NULL

json_valid()函数

json_valid(X)函数如果参数X是格式正确的JSON,则返回1,如果参数X不是格式正确的JSON,则返回0。

json_valid('{"x":35}') → 1
json_valid('{"x":35') → 0

json_quote()函数

json_quote(X)函数将SQL值X(一个数字或一个字符串)转换为其相应的JSON表示。

如果X已经是格式正确的JSON,那么这个函数就没有作用。

json_quote(3.14159) → 3.14159
json_quote('verdant') → '"verdant"'
json_quote('[1]') → '"[1]"'
json_quote(json('[1]')) → '[1]'
json_quote('[1,') → '"[1"'

json_group_array()和json_group_object()聚合SQL函数

json_group_array(X)函数是一个聚合SQL函数,该函数返回一个由聚合中所有X值组成的JSON数组。

同样,json_group_object(NAME,VALUE)函数返回由聚合中的所有NAME / VALUE对组成的JSON对象。

json_each()和json_tree()的表值函数

json_each(X) 和 json_tree(X)表值函数遍历作为其第一个参数提供的 JSON 值,并为每个元素返回一行。

json_each(X) 函数仅遍历顶级数组或对象的直接子元素,或者如果顶级元素是原始值,则仅遍历顶级元素本身。json_tree(X) 函数从顶级元素开始递归遍历 JSON 子结构。

json_each(X,P)和json_tree(X,P)函数的工作原理和它们的单参数对应函数一样,只是它们将路径P所标识的元素视为顶层元素。

总结

如果是小应用sqlite还是不错的选择,现在还支持了JSON,很Nice!

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: