【发布时间】:2019-12-17 12:12:24
【问题描述】:
我正在尝试使用 SQL Server 中的内置 JSON 函数在现有 JSON 中插入一个值。
现有的 JSON:
{
"array": [
{
"type": "_api",
"content": {
"acId": "sometext/567890"
}
}
]
}
SET @JSONData = JSON_MODIFY(@JSONData,'$.array[0].content.uId ', 'sometext/1234/locations/1234')
但是插入到 JSON 中的结果值如下所示。
我需要它来
sometext/1234/locations/1234 但它被添加为sometext\/1234\/locations\/1234。
{
"array": [
{
"type": "_api",
"content": {
"acId": "sometext/567890",
"uId": "sometext\/1234\/locations\/1234"
}
}
]
}
【问题讨论】:
-
没有区别。这是一种逃避,虽然没有必要,但不一定是坏习惯。它只是使用 \. 转义可以被视为控制字符的 anything
-
如果你想修复它,试试
SET @JSONData = REPLACE(JSON_MODIFY(@JSONData,'$.array[0].content.uId ', 'sometext/1234/locations/1234'), "\\/", "/") -
STRING_ESCAPE()explicitly mentions 表示对于 JSON,它将尝试转义固线(正斜杠),尽管它没有提到JSON_MODIFY()在幕后使用STRING_ESCAPE()。作为一种解决方法,您可以考虑使用不同的字符并更改您的使用者以理解,例如,管道或分号,或数据中不存在的其他分隔符。或者您可以在修改后简单地暴力破解REPLACE()(尽管这有替换其他有效字符序列的危险)。 -
感谢大家的帮助,我已经更正了,替换"\\/"应该是'\/'并且Json_modify应该转换回Varchar SET @JSONData = REPLACE(CAST(JSON_MODIFY( @JSONData,'$.array[0].content.uId ', 'sometext/1234/locations/1234') AS nvarchar(max)) , '\/', '/')
-
SET @JSONData = JSON_MODIFY(@JSONData,'$.array[0].content.uId ', JSON_QUERY('sometext/1234/locations/1234'));
标签: sql json sql-server tsql