从 SQL 获取未转义的 JSON

exp*_*uin 7 sql t-sql sql-server json

我创建了一个存储过程来从 SQL Server 数据库中以 JSON 对象的形式提取数据。我的所有数据都是相关的,我试图将其作为 JSON 字符串获取。

目前,我可以很好地从 SQL Server 中获取 JSON 字符串,但是该对象始终包含转义字符(例如“{\”field\”:\“value\”})。我想提取相同的内容JSON,但没有转义字符。为了测试这一点,我使用了一些简单的查询,并使用SqlDataAdapter我的存储过程将它们输入.NET。

让我困惑的是,当我在 SSMS 中运行查询时,我从未看到任何转义字符,但是一旦它拉出 .NET 应用程序,转义字符就会出现。我想防止这种情况发生,并让我的应用程序仅获取未转义的 JSON 字符串。

我尝试了在研究过程中发现的一些建议,但没有产生我想要的结果。我所看到的更改(记录在 MSDN 和其他 SO 帖子中)涉及获取未转义的结果,但仅限于 SSMS 内,而不是其他应用程序内。

我尝试过的:

简单的 Json 查询设置为参数,然后使用 JSON_QUERY 来选择参数:

DECLARE @JSON varchar(max)

SET @JSON = (SELECT '{"Field":"Value"}' AS myJson FOR JSON PATH)

SELECT JSON_QUERY(@JSON) AS 'JsonResponse' FOR JSON PATH
Run Code Online (Sandbox Code Playgroud)

这会在 .NET 应用程序中生成以下内容:

"[{\"JsonResponse\":{\"Field\":\"Value\"}}]"
Run Code Online (Sandbox Code Playgroud)

这会在 SSMS 中生成以下内容:

[{"JsonResponse":[{"myJson":"{\"Field\":\"Value\"}"}]}]
Run Code Online (Sandbox Code Playgroud)

使用 JSON_QUERY 进行不带参数的简单 Json 查询:

SELECT JSON_QUERY('{"Field":"Value"}') AS 'JsonResponse' FOR JSON PATH
Run Code Online (Sandbox Code Playgroud)

这会在 .NET 应用程序中生成以下内容

"[{\"JsonResponse\":{\"Field\":\"Value\"}}]"
Run Code Online (Sandbox Code Playgroud)

这会在 SSMS 中生成以下内容

[{"JsonResponse":{"Field":"Value"}}]
Run Code Online (Sandbox Code Playgroud)

使用 JSON_QUERY 对临时表进行简单的 Json 查询:

CREATE TABLE #temp(
    jsoncol varchar(255)
)

INSERT INTO #temp VALUES ('{"Field":"Value"}')

SELECT JSON_QUERY(jsoncol) AS 'JsonResponse' FROM #temp FOR JSON PATH

DROP TABLE #temp
Run Code Online (Sandbox Code Playgroud)

这会在 .NET 应用程序中生成以下内容:

"[{\"JsonResponse\":{\"Field\":\"Value\"}}]"
Run Code Online (Sandbox Code Playgroud)

这会在 SSMS 中生成以下内容:

[{"JsonResponse":{"Field":"Value"}}]
Run Code Online (Sandbox Code Playgroud)

我相信如果没有转义字符,就无法从 SQL Server 中获取 JSON 字符串。如果上面的示例还不够,我在此处包含了我的存储过程。希望有人能指出我正确的方向。

Shn*_*ugo 2

这取决于你在哪里查看字符串......

在 SSMS 中,字符串用单引号标记。双引号可以毫无问题地存在于字符串中:

DECLARE @SomeString = 'This can include "double quotes" but you have to double ''single quote''';
Run Code Online (Sandbox Code Playgroud)

在 C# 应用程序中,双引号是字符串标记。所以上面的例子看起来像这样:

string SomeString = "This must escape \"double quotes\" but you can use 'single quote' without problems";
Run Code Online (Sandbox Code Playgroud)

在您的 IDE(是 VS?)中,您可以按原样查看字符串,也可以按您需要在代码中使用的字符串查看。您的示例显示"在字符串的开头和结尾。这是一个明确的提示,这是代码中的选项。您可以使用该字符串并将其放入您的代码中。使用和处理的真实字符串不会包含转义字符。

提示:只有在人类可读的格式中才需要转义字符,其中存在具有特殊含义的字符(;CSV 中的 a、<HTML 中的 a 等等)...

更新更多解释

需要转义字符才能将字符串放入字符串中不知何故,你必须标记字符串的开头和结尾,但除了一些神奇字符之外,你没有其他可以使用的东西。

为了在嵌入字符串中使用这些字符,您必须采用以下方法之一:

  1. 转义(例如,XML 将替换&&amp;,JSON 将替换 a ,"因为\"JSON 使用"来标记其标签)或
  2. 神奇的边框(例如XML 中的 -section,它允许按原样CDATA放置未转义的字符:)<![CDATA[forbidden characters &<> allowed here]]>

无论您做什么,都必须区分编辑器或基于文本的容器(如 XML 或 JSON)中的可见字符串以及应用程序从中选取的值。

一个例子:

<root><a>this &amp; that</a></root> 
visible string: "this &amp; that"
real value: "this & that"
Run Code Online (Sandbox Code Playgroud)