如何在 SQL Server 中解析 json 格式的字符串

Posted

技术标签:

【中文标题】如何在 SQL Server 中解析 json 格式的字符串【英文标题】:How to parse a string in json format in SQL Server 【发布时间】:2017-01-13 11:49:19 【问题描述】:

SQL Server 或 Visual Studio 中是否有一种方法/函数/reg-ex 可以转义字符串中的任何字符/特殊字符?

我有一个功能/页面,其中有服务器文本字段,用户可以在那里输入任何类型的字符串(包括特殊字符)。结果,我将 JSON 字符串显示为这些文本字段条目的“键”、“值”部分。

例如:我在页面上有这些字段:

Name ,  LastName , Address

以上字段的输入值为:

Name : *-+-#.  Wwweee4426554456666yyyy5uuuuttrrrreree6655zfgh\\][;'/.uuuuuuuu66uuyt,+_)(*&^%$#@!~|:\\\"?><\\\\][;'/.,+_)(*&^%$#@!~|:\\\"?><\\\\][;'/.,+_)(*&^%$#@!~|:\\\"?><\\\\][;'/.,+_)(*&^%$#@!~|:\

LastName : Piterson
Address  : Park Road, LA

我在下面显示的输出类似于 JSON 字符串-

["Key":"Name","Value":"*-+-#.Wwweee4426554456666yyyy5uuuuttrrrreree6655zfgh\\][;'/.uuuuuuuu66uuyt,+_)(*&^%$#@!~|:\\\"?><\\\\][;'/.,+_)(*&^%$#@!~|:\\\"?><\\\\][;'/.,+_)(*&^%$#@!~|:\\\"?><\\\\][;'/.,+_)(*&^%$#@!~|:\","Key":"LastName","Value":"Piterson","Key":"Address","Value":"Park Road, LA"]

但是在解析这个字符串时,我在下面遇到一个解析错误 -

"After parsing a value an unexpected character was encountered: K. Path '[4].Value', line 1, position 1246."

我正在使用下面的 SQL Server 函数来解析字符串 -

ALTER function [dbo].[fnEscapeString](@text nVARCHAR(MAX))
RETURNS NVARCHAR(MAX)  
as
BEGIN

    --if(CHARINDEX() )
    if (CHARINDEX('\',@text) > 0)
    set @text = Replace(@text,'\','\\')

    if (CHARINDEX('"',@text) > 0)
    set @text = Replace(@text,'"','\"')

    return @text

END

此函数在许多其他情况下(与许多其他字符串)都有效。但不适用于上述字符串。我认为这个函数不足以解析所有类型的字符串。

那么有什么方法可以解析有效 JSON 行格式的字符串。可能是任何 reg-ex 或 sql 函数都可以做到这一点。请提出建议。

【问题讨论】:

SQL-Server 的哪个版本? 给定的示例不超过 300 个字符。您的错误消息说明了 位置 1246。您提供的功能似乎适用于给定的字符串...可能是问题发生在其他地方... @Shnugo,SQL Server 2012 @Shnugo,我刚刚分享了一段代码,例如整个字符串很大。但关键是这个字符串没有被我的函数解析为 JSON 格式。 如何构建 JSON?当前字符串不是有效的 JSON 【参考方案1】:

比如2016年可以直接把你的表数据转成json,

SELECT name, surname  
FROM emp  
FOR JSON AUTO  

但在较低版本的情况下,您必须将您的 sql 表数据转换为 xml,然后再转换为 Json。

请参考此链接将 SQL 数据解析为 Json。

http://www.codeproject.com/Articles/815371/Data-Parsing-SQL-to-JSON

【讨论】:

【参考方案2】:

你可以试试这个here var my_JSON_object = !(/[^,:\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test( text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');

【讨论】:

我需要 C# 或 SQL Server 中的解决方案。【参考方案3】:

尝试使用以下方法将输入字符串转换为 JSON:

a) System.Web.HttpUtility.javascriptStringEncode

string jsonEncoded = HttpUtility.JavaScriptStringEncode(s)

b) NuGet 包 Newtonsoft.Json

string jsonEncoded = JsonConvert.ToString(s)

参考:How to escape JSON string?

【讨论】:

以上是关于如何在 SQL Server 中解析 json 格式的字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER解析Json

关于SQL Server 2017中使用json传参时解析遇到的多层解析问题

sql中json解析

在 SQL Server 2008R2 中解析 Json 并计算值

解析 JSON 文件并将数据插入 SQL Server

如何将拼凑的json串存入sqlserver中