我将以下
json
字符串存储在数据库字段中:
{"name" : "John Paul Mark", "surname" : "Johnson"}
注意
name
由 3 个不同的名称组成,它们之间有一个空格。
我需要修剪字符串,删除
json
key/values
之间的空格,以获得最终的字符串:
{"name":"John Paul Mark","surname":"Johnson"}
保持
值中的空格不变。我尝试使用
key/values
但它无法按预期工作,因为它替换了 json 字符串中的all 空格。 有什么想法吗?我可以使用任何本机 sql 功能来代替创建自定义函数吗?
谢谢
Replace(@myString, ' ', '')
或
:
时可能会失败),但作为解决方法应该有效:
,
本机 JSON 支持将适用于
SQL Server 2016
第一个函数使用带有 openjson() 的递归 CTE 将 JSON 扁平化为来自 JSON 所有深度的键值对表。这使得第二个函数可以轻松地比较每次更改之前和之后,以查看 JSON 值是否被意外修改。
第二个函数进行缩小。它将光标悬停在要删除的一组字符上,然后遍历找到的每个字符的字符串以测试删除并将结果与原始结果进行比较,以确保在保留更改之前更改是安全的。
在此示例中,您可以看到换行符和空格被删除,而不会影响恰好具有类似于 JSON 结构但实际上不是 JSON 的内容的值:
create table json_array (json varchar(1000));
insert into json_array(json) values('{"name" : "John Paul Mark", "surname" : "Johnson"}');
select concat(concat(concat(concat(trim(substr(json, 1, locate(':', json)-1)),':'), concat(trim(substr(json, locate(':', json)+1, locate(',',json)-locate(':' , json)-1 ) ),',')), concat(trim(substr(json, locate(',', json)+1, locate(':',json, locate(':', json)+1)-locate(',', json)-1 ) ),':')), trim(substr(json, locate(':', json, locate(':', json)+1)+1))) as output from json_array;
如果您对扁平化输出感到好奇,请对任何 json 内容运行此查询:
declare @json varchar(max) = '{
"test": "testing { internal [ ] tokens } ",
"test2": [ "test-val" ] ,
"test3": 123
}'
select dbo.json_minify(@json) as minified
--> {"test":"testing { internal [ ] tokens }","test2":["test-val"],"test3":123}
删除 select * from dbo.json_flatten(@json) where intermediate = 0 order by path
上的过滤器以查看中间值的行。排除它们是正常的,但有时在调试时查看它们很有用。我不会做任何保证,但它似乎在我测试过的情况下运行良好,并且对于我的小集来说速度还可以。为了提高大型集的效率,您可能希望将其作为清理的一部分来运行,而不是为了获得大输出而动态运行。
如果您选择使用它,我欢迎提出改进意见以及有关其性能的任何评论。
intermediate = 0