插入数据库之前先序列化JSON

时间:2019-02-16 16:45:29

标签: sql json sql-server

我有一个代码,可以从Coldfusion页面获取嵌套结构。

我需要将数据序列化为JSON才能插入SQL,我可以通过ColdFusion进行操作,但这是非常麻烦的。我可以仅将结构传递给SQL插入,然后SQL可以将其转换为该JSON并将其插入吗?

听起来像一个愚蠢的问题,但是我想尽我所能减少代码。

这是我的结构:

http://prntscr.com/mlye0r

<cfset myStruct = {
    "sd": {
        "sp": 100,
        "cn": 100,
        "id": 100
    }
}>
<cfdump var="#myStruct#">

2 个答案:

答案 0 :(得分:0)

我不确定您的问题,但是如果您使用的是Javacript,则可以使用class B(A): def __init__(self, var2=15): super().__init__(var2=var2) 来序列化为字符串。如果您正在使用像c#这样的服务器语言,那么您将拥有一些newtonsoft这样的库。使用它们真的很简单。...

如果您的问题是您的json文件很大,并且对服务器的请求将花费太长时间,则可以将json文件压缩为BSON,但是无论如何,如果您遇到问题,我建议您首先查看您的后台服务器,以便将较小的请求发送到服务器。

然后看看this link。由于Sql Server 2016已上载,因此您正在寻找的此功能是可能的。

答案 1 :(得分:0)

JSON支持在v2016之前推出。因此,以下代码将需要SQL-Server-2016 +:

您可能会引入一个存储过程,该存储过程接受类型为NVARCHAR(MAX)的参数,并按原样传递结构 来调用它。这是在SP中模拟代码:

DECLARE @YourStruct NVARCHAR(1000)=
N'<cfset myStruct = {
    "sd": {
        "sp": 100,
        "cn": 100,
        "id": 100
    }
}>
<cfdump var="#myStruct#">';

SELECT *
FROM OPENJSON(JSON_QUERY(REPLACE(SUBSTRING(REPLACE(@YourStruct,N'<cfdump var="#myStruct#">',N''),CHARINDEX(N'{',@YourStruct),LEN(@YourStruct)),N'}>',N'}')),N'$.sd')
WITH(sp INT,cn INT, id INT);

您可以阅读为

  • <cfdump var="#myStruct#">替换为空
  • 以第一个{开头的字符串开始读取字符串
  • 用单个}>代替}
  • 使用JSON_QUERY()将此字符串解释为JSON(并避免使用转义引号)
  • 使用OPENJSON()深入JSON并读取其值
  • 使用WITH子句直接掌握直接键入的内部变量

关于HTML-XHTML-XML ...的一些想法

遗憾的是,该结构看起来像XML,但不是有效的XML(由于无效的XML属性myStruct)。从XHTML检索此JSON要容易得多,但是在这种情况下,您必须将结构作为

提交。

提示将T-SQL语法的单引号加倍...

DECLARE @YourStruct NVARCHAR(1000)=
N'<cfset myStruct = ''{
    "sd": {
        "sp": 100,
        "cn": 100,
        "id": 100
    }
}''/>
<cfdump var="#myStruct#"/>';

这是用XML编写的

SELECT CAST(@yourstruct as xml)

<cfset myStruct="{   &quot;sd&quot;: {    &quot;sp&quot;: 100,    &quot;cn&quot;: 100,    &quot;id&quot;: 100   }  }" />
<cfdump var="#myStruct#" />

这可以通过本机XML方法.value()

检索
SELECT CAST(@yourstruct as xml).value('(/cfset/@myStruct)[1]','nvarchar(max)')