gpt4 book ai didi

sql - 从 SQL 获取未转义的 JSON

转载 作者:行者123 更新时间:2023-12-03 19:32:14 24 4
gpt4 key购买 nike

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

目前,我能够从 SQL Server 中取出一个 JSON 字符串就好了,但是这个对象总是包含转义字符(例如 "{\"field\":\"value\"})。我想提取相同的JSON 但没有转义字符。为了测试这一点,我使用了一些简单的查询,并使用我的存储过程通过 SqlDataAdapter 将它们放入 .NET。

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

我已经尝试了我在研究过程中发现的一些建议,但没有产生我想要的结果。我看到的变化(记录在 MSDN 和其他 SO 帖子中)已经处理了未转义的结果,但仅限于 SSMS 而不是在其他应用程序中。

我试过的:

简单的 Json 查询设置为 param,然后使用 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

这会在 .NET 应用程序中生成以下内容:
"[{\"JsonResponse\":{\"Field\":\"Value\"}}]"

这会在 SSMS 中产生以下内容:
[{"JsonResponse":[{"myJson":"{\"Field\":\"Value\"}"}]}]

使用 JSON_QUERY 的不带参数的简单 Json 查询:
SELECT JSON_QUERY('{"Field":"Value"}') AS 'JsonResponse' FOR JSON PATH

这会在 .NET 应用程序中生成以下内容
"[{\"JsonResponse\":{\"Field\":\"Value\"}}]"

这会在 SSMS 中产生以下内容
[{"JsonResponse":{"Field":"Value"}}]

使用 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

这会在 .NET 应用程序中生成以下内容:
"[{\"JsonResponse\":{\"Field\":\"Value\"}}]"

这会在 SSMS 中产生以下内容:
[{"JsonResponse":{"Field":"Value"}}]

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

最佳答案

这取决于你在哪里看字符串......
在 SSMS 中,字符串标记为 单引号 .双引号可以毫无问题地存在于字符串中:

DECLARE @SomeString = 'This can include "double quotes" but you have to double ''single quote''';
在 C# 应用程序中, 双引号是字符串标记。所以上面的例子看起来像这样:
string SomeString = "This must escape \"double quotes\" but you can use 'single quote' without problems";
在您的 IDE 中(它是 VS 吗?),您可以按原样或需要在代码中使用的方式查看字符串。您的示例显示 "在字符串的开头和结尾。这是一个明确的提示,这是代码中的选项。您可以使用此字符串并将其放入您的代码中。使用和处理的真实字符串将不包含转义字符。
提示:只有在人类可读的格式中才需要转义字符,其中存在具有特殊含义的字符(CSV 中的 ;,HTML 中的 < 等等)...
更新一些更多的解释
在字符串中放置字符串需要转义字符。您必须以某种方式标记字符串的开头和结尾,但是除了一些魔术字符之外,您无法使用其他任何东西。
为了在嵌入的字符串中使用这些字符,您必须采用以下方法之一:
  • 转义(例如,XML 将 & 替换为 &amp;,JSON 将 " 替换为 \",因为 JSON 使用 " 来标记其标签)或
  • 魔术边框(例如 XML 中的 CDATA -section,它允许按原样放置未转义的字符: <![CDATA[forbidden characters &<> allowed here]]> )

  • 无论你做什么,你必须区分 可见字符串 在编辑器或基于文本的容器中,如 XML 或 JSON 和 应用程序会从中挑选出来。
    一个例子:
    <root><a>this &amp; that</a></root> 
    visible string: "this &amp; that"
    real value: "this & that"

    关于sql - 从 SQL 获取未转义的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53286203/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com