C#-在SSIS脚本任务中反序列化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,

我需要从web服务读取JSON数据

为此,我在SSIS中创建了一个C#脚本任务。我能够连接到该服务,进行身份验证并返回web服务的结果

JSON的格式如下:

{
    "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版+

  • 如果SSIS中有一个变量,我们将只调用JsonResponse,Type=String
  • 您已经有了调用web服务的C#脚本任务,请将JsonResponse变量添加为ReadWriteVariables
  • 修改脚本任务并将响应写入该变量,我通常会将响应流传输到单独的变量,然后将其分配给我的ReadWriteVariables:

            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;
                }
            }
    
  • 在控制流中的脚本任务之后,添加一个执行SQL任务

  • 在这里,您将调用一个存储过程,该过程具有@JsonResponse-NVARCHAR(MAX)参数
  • 您将把上面的JsonResponse传递给这个存储过程,然后使用该过程,您可以使用OPENJSON解析该JSON,并使用它做您想做的事情。插入另一个表等
  • 下面是一个关于如何解析所提供示例的T-SQL的示例。显然,您必须进行必要的调整,以将其转换为存储过程,并根据您特别想要实现的目标进行相应的调整:

    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#中的反序列化非常简单。:)