【问题标题】:JSON_MODIFY is adding extra "\" in front of "/"JSON_MODIFY 在“/”前面添加了额外的“\”
【发布时间】: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


【解决方案1】:

用替换为不正确的字符来封装您的 JSON_MODIFY:

SET @JSONData = REPLACE(JSON_MODIFY(@JSONData,'$.array[0].content.uId ', 'sometext/1234/locations/1234'), "\\/", "/")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多