C#-在SSIS脚本任务中反序列化JSON
我需要从web服务读取JSON数据 为此,我在SSIS中创建了一个C#脚本任务。我能够连接到该服务,进行身份验证并返回web服务的结果 JSON的格式如下:C#-在SSIS脚本任务中反序列化JSON,c#,json,ssis,C#,Json,Ssis,我需要从web服务读取JSON数据 为此,我在SSIS中创建了一个C#脚本任务。我能够连接到该服务,进行身份验证并返回web服务的结果 JSON的格式如下: { "20": { "kpiData": [ { "date": "2018-10-01", "interval": "DAILY", "kpiFigure": 80,
{
"20": {
"kpiData": [
{
"date": "2018-10-01",
"interval": "DAILY",
"kpiFigure": 80,
"symbol": null,
"additionalInfo": {}
},
{
"date": "2018-10-02",
"interval": "DAILY",
"kpiFigure": 58,
"symbol": null,
"additionalInfo": {}
}
],
"average": 69,
"weightedAverage": 0,
"max": 80,
"min": 58,
"total": 138,
"symbol": ""
},
"24": {
"kpiData": [
{
"date": "2018-10-01",
"interval": "DAILY",
"kpiFigure": 133,
"symbol": null,
"additionalInfo": {}
},
{
"date": "2018-10-02",
"interval": "DAILY",
"kpiFigure": 130,
"symbol": null,
"additionalInfo": {}
}
],
"average": 132,
"weightedAverage": 0,
"max": 133,
"min": 130,
"total": 263,
"symbol": ""
}
}
SiteID ¦ date ¦ interval ¦ kpiFigure
20 ¦ 2018-10-01 ¦ DAILY ¦ 80
...
我如何在C#脚本任务中反序列化它
我需要让它以“扁平化”结构输出缓冲区,如下所示:
{
"20": {
"kpiData": [
{
"date": "2018-10-01",
"interval": "DAILY",
"kpiFigure": 80,
"symbol": null,
"additionalInfo": {}
},
{
"date": "2018-10-02",
"interval": "DAILY",
"kpiFigure": 58,
"symbol": null,
"additionalInfo": {}
}
],
"average": 69,
"weightedAverage": 0,
"max": 80,
"min": 58,
"total": 138,
"symbol": ""
},
"24": {
"kpiData": [
{
"date": "2018-10-01",
"interval": "DAILY",
"kpiFigure": 133,
"symbol": null,
"additionalInfo": {}
},
{
"date": "2018-10-02",
"interval": "DAILY",
"kpiFigure": 130,
"symbol": null,
"additionalInfo": {}
}
],
"average": 132,
"weightedAverage": 0,
"max": 133,
"min": 130,
"total": 263,
"symbol": ""
}
}
SiteID ¦ date ¦ interval ¦ kpiFigure
20 ¦ 2018-10-01 ¦ DAILY ¦ 80
...
这不是C#路线,根据我的评论和您的回答,您可能希望在t-SQL中探索这样做。如果您以前没有这样做过,下面是一个高级示例,说明如何在SSIS中连接它。只要您是SQL Server 2016版+
using (var response = (HttpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader streamReader = new StreamReader(responseStream))
{
responseString = streamReader.ReadToEnd();
}
Dts.Variables["User::JsonResponse"].Value = responseString;
}
}
DECLARE @JsonResponse NVARCHAR(MAX);
SET @JsonResponse = N'
{
"20": {
"kpiData": [
{
"date": "2018-10-01",
"interval": "DAILY",
"kpiFigure": 80,
"symbol": null,
"additionalInfo": {}
},
{
"date": "2018-10-02",
"interval": "DAILY",
"kpiFigure": 58,
"symbol": null,
"additionalInfo": {}
}
],
"average": 69,
"weightedAverage": 0,
"max": 80,
"min": 58,
"total": 138,
"symbol": ""
},
"24": {
"kpiData": [
{
"date": "2018-10-01",
"interval": "DAILY",
"kpiFigure": 133,
"symbol": null,
"additionalInfo": {}
},
{
"date": "2018-10-02",
"interval": "DAILY",
"kpiFigure": 130,
"symbol": null,
"additionalInfo": {}
}
],
"average": 132,
"weightedAverage": 0,
"max": 133,
"min": 130,
"total": 263,
"symbol": ""
}
}
';
SELECT [a].[Key] AS [SiteID]
, [b].*
FROM OPENJSON(@JsonResponse) [a]
CROSS APPLY OPENJSON([a].[Value], '$.kpiData')
WITH (
[date] DATE '$.date'
, [interval] NVARCHAR(100) '$.interval'
, [kpiFigure] INT '$.kpiFigure'
) [b];
这只是一个选项/示例,说明如何将JSON传递到T-SQL并从那里解析它。不,JSON反序列化是其中的一部分,但您必须混合所有SSIS脚本任务。在SSIS中,脚本任务可以操纵SSIS状态和SSIS变量。脚本转换组件(放置在数据流表面上)可以将输入列逐行转换为输出列。然而,我认为您正在寻找的是充当行源的东西(比如连接管理器)。看看这个:。它提供了一个JSON源对象,我认为这正是您要寻找的。注意,我没有这方面的经验。谢谢!我看过第三方组件,但我不想为此使用商业组件。我已经有一个自定义脚本任务即将完成——我正在将web服务响应转换为c#字符串。现在我只需要对我发布的结构进行反序列化——例如,在C#中遍历它并将其放入输出缓冲区。不幸的是,我对c不太有经验/然后,您只需添加NewtonSoft JSON NuGet包,创建与JSON数据匹配的类型并反序列化数据。有很多这样做的例子,我试过使用nuget,但在ssis脚本任务中似乎不支持。每当我添加它时,当它构建并集成到ssis中时,引用似乎就丢失了:(这正是我所需要的。非常感谢!我没有想到t-SQL中的JSON-我认为C#中的反序列化非常简单。:)