Разбирать данные JSON в пакете услуг интеграции SQL Server?

Я пытаюсь настроить SSIS-задание, которое вытащит JSON-кодированный список рассылки из MailChimp, сравните его со списком клиентов в нашей базе данных CRM (SQL Server) и загрузите через JSON новых клиентов там. Кажется, я ничего не могу найти при сериализации/десериализации JSON в SSIS, кроме написания задачи script, и кажется, что я не могу импортировать библиотеки сериализации .Net в script. Какие-либо предложения? Спасибо заранее!

Ответ 1

Пара вещей, чтобы обратиться сюда:

Во-первых, ваша проблема с добавлением новых библиотек в компонент сценариев. Я предполагаю, что вы используете VS 2008 для разработки своей SSIS и хотите использовать библиотеку .net 3.5 для этого. Вы идете в проект, добавляете ссылку, и вы не видите ни одной из DLL, в которой вы нуждаетесь. Это может быть отчасти тем, что вы используете окна 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\Framework\v3.5. Между этими двумя каталогами вы найдете любую DLL, необходимую для сериализации/десериализации JSON. Они могут быть добавлены в ваш проект, перейдя в Project → Add Reference → Browse Tab, затем перейдите в каталог v3.5 и выберите нужные вам библиотеки (System.Web.Extensions.dll(v3.5.30729.5446). ) используется в этом примере).

Чтобы получить JSON из веб-службы, десериализовать его и отправить данные в вашу базу данных CRM, вам нужно будет использовать компонент script в качестве источника в потоке данных и добавить столбцы в выходной буфер, который будет используется для хранения данных, поступающих из канала JSON (на экране ввода и вывода). В коде вам необходимо переопределить метод CreateNewOutputRows. Вот пример того, как это сделать:

Скажите, что ваш JSON выглядел так: [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

Я бы определил класс для зеркалирования этих атрибутов канала JSON (и столбцов, которые вы определили на экране ввода и вывода), которые в конечном итоге будут удерживать эти значения после десериализации... как таковых:

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; }
}

Теперь вам нужно позвонить в свою веб-службу и получить канал JSON с помощью HttpWebRequest и потока:

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;
        }

Вот как будет выглядеть весь код, составленный вместе (у меня есть шаг за шагом пример здесь):

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 для сравнения данных и поиска несоответствий, отправки данных в другой компонент script для сериализации и отправки любых обновлений, которые вам нужны обратно в веб-службу.

ИЛИ

Вы можете сделать все в компоненте script, а не выводить данные в выходной буфер. В этой ситуации вам все равно придется десериализовать JSON, но поместите данные в какую-то коллекцию. Затем используйте инфраструктуру сущности и LINQ для запроса вашей базы данных и коллекции. Определите, что не соответствует, не сериализуйте его и отправьте в веб-службу в том же компоненте script.