首页 > 解决方案 > 使用 JSON_VALUE 返回包含 \n 作为换行符的 JSON 值

问题描述

考虑 Microsoft SQL Server 中的以下 T-SQL:

SELECT JSON_VALUE ('{"Value": "Normal Text 304\n1212\n1212\n121\na"}', '$.Value')

执行此操作时,\n将数据转换为 ASCII 10(换行符),并返回以下内容:

Normal Text 304 1212 1212 121 a

但是,我需要按如下方式返回 JSON 值,以便可以将该值注入到另一个 JSON 结构中。

Normal Text 304\n1212\n1212\n121\na

例如:

SELECT
    ISJSON ('{"New Value": "' +  JSON_VALUE ('{"Value": "Normal Text 304\n1212\n1212\n121\na"}', '$.Value') +'"}')

这将返回0,因为 JSON 无效,因为它包含 ASCII 代码10

我将不胜感激有关如何从 JSON 结构中获取 JSON 格式的字符串值以粘贴到另一个 JSON 结构中的任何建议?

我可以从 ASCII 码转换10回,\n但这不是一个理想的解决方案。

标签: jsonsql-servertsqljson-value

解决方案


如果您使用 SQL Server 2017+,STRING_ESCAPE()则可以选择:

SELECT STRING_ESCAPE(
   JSON_VALUE('{"Value": "Normal Text 304\n1212\n1212\n121\na"}', '$.Value'), 
   'json'
) As EscapedJson

结果:

EscapedJson
-----------------------------------
Normal Text 304\n1212\n1212\n121\na

您可以使用JSON_MODIFY(). 在这种情况下,如文档中所述,JSON_MODIFY() 如果值的类型是 NVARCHAR 或 VARCHAR,则 ...转义新值中的所有特殊字符。

SELECT JSON_MODIFY(
   '{"Key": "Normal Text"}',
   '$."New Value"',
   JSON_VALUE('{"Value": "Normal Text 304\n1212\n1212\n121\na"}', '$.Value')
) AS ModifiedJson

结果:

ModifiedJson
------------------------------------------------------------------------
{"Key": "Normal Text","New Value":"Normal Text 304\n1212\n1212\n121\na"}

推荐阅读