sql-server - 解析 SQL Server 集成服务包中的 JSON 数据?

标签 sql-server json ssis

我正在尝试设置一个 SSIS 作业,该作业将从 MailChimp 中提取 JSON 编码的邮件列表,将其与我们的 CRM 数据库 (SQL Server) 中的客户列表进行比较,并通过 JSON 上传尚未存在的任何新客户那里。除了编写脚本任务之外,我似乎无法在 SSIS 中找到有关序列化/反序列化 JSON 的任何内容,并且似乎无法将 .Net 序列化库导入到脚本中。有什么建议么?提前致谢!

最佳答案

这里需要解决一些问题:

首先,在脚本组件中添加新库时遇到的问题。我假设您正在使用 VS 2008 进行 SSIS 开发,并希望使用 .net 3.5 库来执行此操作。您转到项目,添加引用,但没有看到任何您需要的 dll。这可能部分是因为您使用的是 Windows 7 和紧凑型 3.5 框架。 .net 3.5.1 随 Windows 7 一起提供,您只需启用它即可。转到控制面板、程序和功能。在该屏幕中,您将看到打开或关闭 Windows 功能,单击它。在该窗口中检查 Microsoft .NET Framework 3.5.1,这样需要几分钟才能运行。完成后,查找类似于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v3.5\Profile\Client 和 C:\Program Files (x86)\Reference Assemblies\Microsoft\的目录框架\v3.5。在这两个目录之间,您将找到 JSON 序列化/反序列化所需的任何 dll。可以通过转到“项目”-->“添加引用”-->“浏览选项卡”将这些添加到您的项目中,然后导航到 v3.5 目录并选择您需要的 dll(System.Web.Extensions.dll(v3.5.30729.5446 )在本例中使用)。

要从 Web 服务获取 JSON、反序列化并将数据发送到 CRM 数据库,您必须使用脚本组件作为数据流中的源,并将列添加到输出缓冲区,该缓冲区将用于保存来自 JSON feed 的数据(在输入和输出屏幕上)。在代码中,您需要重写 CreateNewOutputRows 方法。以下是如何执行此操作的示例:

假设您的 JSON 看起来像这样...[{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0 },{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

我首先定义一个类来镜像此 JSON feed 属性(以及您在输入和输出屏幕上定义的列),一旦您反序列化,该属性最终将保存这些值...如下所示:

class WorkGroupMetric
{
    public string CN { get; set; }

    public string IN { get; set; }

    public int CO { get; set; }

    public int CA { get; set; }

    public int AB { get; set; }
}

现在您需要调用 Web 服务并使用 HttpWebRequest 和 Stream 获取 JSON 提要:

string wUrl = "YOUR WEB SERVICE URI";
string jsonString;
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl);
HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse();
Stream responseStream = httpWResp.GetResponseStream();
using (StreamReader reader = new StreamReader(responseStream))
            {
                jsonString = reader.ReadToEnd();
                reader.Close();
            }

现在我们将 json 反序列化为 WorkGroupMetric 数组

JavaScriptSerializer sr = new JavaScriptSerializer();
WorkGroupMetric[] jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString);

反序列化后,我们现在可以将行输出到输出缓冲区:

 foreach (var metric in jsonResponse)
        {

            Output0Buffer.AddRow();
            Output0Buffer.CN = metric.CN;
            Output0Buffer.IN = metric.IN;
            Output0Buffer.CO = metric.CO;
            Output0Buffer.CA = metric.CA;
            Output0Buffer.AB = metric.AB;
        }

这是所有代码组合在一起的样子(我有一个逐步示例 here ):

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Net;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Web.Script.Serialization;


 [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
 public class ScriptMain : UserComponent
 {

public override void CreateNewOutputRows()
{
    string wUrl = "YOUR WEB SERVICE URI";

    try
    {
        WorkGroupMetric[] outPutMetrics = getWebServiceResult(wUrl);

        foreach (var metric in outPutMetrics)
        {

            Output0Buffer.AddRow();
            Output0Buffer.CN = metric.CN;
            Output0Buffer.IN = metric.IN;
            Output0Buffer.CO = metric.CO;
            Output0Buffer.CA = metric.CA;
            Output0Buffer.AB = metric.AB;
        }

    }
    catch (Exception e)
    {
        failComponent(e.ToString());
    }

}


private WorkGroupMetric[] getWebServiceResult(string wUrl)
{

    HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl);
    HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse();
    WorkGroupMetric[] jsonResponse = null;

    try
    {

        if (httpWResp.StatusCode == HttpStatusCode.OK)
        {

            Stream responseStream = httpWResp.GetResponseStream();
            string jsonString;

            using (StreamReader reader = new StreamReader(responseStream))
            {
                jsonString = reader.ReadToEnd();
                reader.Close();
            }

            JavaScriptSerializer sr = new JavaScriptSerializer();
            jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString);

        }

        else
        {
            failComponent(httpWResp.StatusCode.ToString());

        }
    }
    catch (Exception e)
    {
        failComponent(e.ToString());
    }
    return jsonResponse;

}

private void failComponent(string errorMsg)
{
    bool fail = false;
    IDTSComponentMetaData100 compMetadata = this.ComponentMetaData;
    compMetadata.FireError(1, "Error Getting Data From Webservice!", errorMsg, "", 0, out fail);

}
}
 class WorkGroupMetric
 {
public string CN { get; set; }

public string IN { get; set; }

public int CO { get; set; }

public int CA { get; set; }

public int AB { get; set; }
 }

现在可以将其用作数据目标(您的 CRM 数据库)的输入。一旦到达那里,您就可以使用 SQL 来比较数据并查找不匹配的地方,将数据发送到另一个脚本组件进行序列化,并将您需要的任何更新发送回 Web 服务。

或者

您可以在脚本组件中执行所有操作,而不是将数据输出到输出缓冲区。在这种情况下,您仍然需要反序列化 JSON,但将数据放入某种集合中。然后使用 Entity Framework 和 LINQ 查询数据库和集合。确定不匹配的内容,将其序列化,然后将其发送到同一脚本组件中的 Web 服务。

关于sql-server - 解析 SQL Server 集成服务包中的 JSON 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11677333/

相关文章:

SQL,获取外键值。外键引用同一张表

excel - 如何在不使用其他软件的情况下将 SSIS 导出到 Microsoft Excel?

SQL - 服务器上所有数据库的 INFORMATION_SCHEMA

sql - TSQL IN 表达式的问题

sql - 使用 SQL Server 将新数组附加到 JSON 对象

Python JSON try except block 不起作用

c# - LINQ .Include() 来自 TPH 继承中子类型的属性

sql-server - 如何将 SQL Server 2005 行导出到 excel?每次我这样做都会出错

sql-server - SSIS Access SQL。绑定(bind)错误: The binding status was "DT_NTEXT"

mysql - 决定数据库需求