Чтение из JSON API с C # в SSIS - PullRequest
       2

Чтение из JSON API с C # в SSIS

4 голосов
/ 18 марта 2019

Я хочу прочитать некоторые данные из JSON API в SSIS и записать их в таблицу в SQL Server. Я решил эту задачу с помощью стороннего разработчика, но решение не так уж и элегантно, поэтому сейчас я пытаюсь выполнить его самостоятельно в Visual Studio, используя компонент сценариев SSIS.

Я искал в Интернете решения и закончил с этим результатом. Пока я достаточно уверен в том, что происходит, но у меня нет окончательного направления для этого. Я знаю, что мне нужно каким-то образом отобразить выходные данные в столбцы, которые я создал в SSIS. Я думаю, что я должен что-то сделать около CreateNewOutputRows(), но я не уверен, что. Может кто-нибудь помочь мне в этом? Кроме того, поскольку это более или менее мой первый в истории скрипт на c #, я также был бы признателен, если есть более простое решение ИЛИ если оно каким-то образом неуместно и т. Д.

Прежде всего, выход API выглядит следующим образом (документация по API здесь) :

 "data":[  
      {  
         "created_at":"2016-03-12 09:45:00",
         "created_at_unix":1457772300,
         "shop_name":"DK - Some name",
         "location_id":1111,
         "custom_location_id":"2222",
         "custom_shop_id":"2222",
         "shop_id":3333,
         "count_in":"1",
         "count_out":"1",
         "timekey":3
      }

Сценарий, который у меня пока есть,

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Linq;
using System.Net;
using System.Collections.Generic;
using Newtonsoft.Json;


[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public static void Main()
    {
        //Test api
        var url = "https://login.vemcount.com/api/fetch_data/?data={"api_key":"xxxxxxx","type":"company_id","id":"10","date_from":"2019-01-01 00:00","interval":"15min", "group_by":"shop_id"}";
        var json = new WebClient().DownloadString(url);

        var root = JsonConvert.DeserializeObject<RootObject>(json);

        //Printing last record
        Console.WriteLine(root.data.Last().created_at);
    }
    public class data
    {

        public string created_at { get; set; }
        public int created_at_unix { get; set; }
        public string shop_name { get; set; }
        public int location_id { get; set; }
        public string custom_location_id { get; set; }
        public string custom_shop_id { get; set; }
        public int shop_id { get; set; }
        public string count_in { get; set; }
        public string count_out { get; set; }
        public int timekey { get; set; }
    }

    public class RootObject
    {
        public List<data> data { get; set; }
    }
    public override void CreateNewOutputRows()
    {

    }

}

1 Ответ

3 голосов
/ 18 марта 2019

Вы поместите весь этот код в CreateNewOutputRows().

Сначала вы должны вручную добавить все столбцы в компонент скрипта. В приведенном здесь примере я добавил только 2 столбца:

enter image description here

Код идет в CreateNewOutPutRows (). У меня нет Newtonsoft, я просто использую JavaScriptSerializer, чтобы показать рабочий пример, чтобы вы могли увидеть, как его подключить:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Web.Script.Serialization;
using System.Collections.Generic;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void CreateNewOutputRows()
    {
        string json = @"{""data"":[{""created_at"":""2016-03-12 09:45:00"",""created_at_unix"":1457772300,""shop_name"":""DK - Some name"",""location_id"":1111,""custom_location_id"":""2222"",""custom_shop_id"":""2222"",""shop_id"":3333,""count_in"":""1"",""count_out"":""1"",""timekey"":3},{""created_at"":""2016-03-12 09:45:00"",""created_at_unix"":1457772300,""shop_name"":""test2"",""location_id"":1111,""custom_location_id"":""2222"",""custom_shop_id"":""2222"",""shop_id"":3333,""count_in"":""1"",""count_out"":""1"",""timekey"":3}]}";

        RootObject Test = new JavaScriptSerializer().Deserialize<RootObject>(json);

        /*
         * This is where data gets added to the output buffer.
         * After AddRow() you are basically mapping the column you manually added(on the left) to the data(on the right).
         * using a foreach loop to loop through the deserialize json
         */
        foreach (var item in Test.data)
        {
            Output0Buffer.AddRow();
            Output0Buffer.createdat = item.created_at;
            Output0Buffer.shopname = item.shop_name;
        }
    }
    public class RootObject
    {
        public List<data> data { get; set; }
    }

    public class data
    {

        public string created_at { get; set; }
        public int created_at_unix { get; set; }
        public string shop_name { get; set; }
        public int location_id { get; set; }
        public string custom_location_id { get; set; }
        public string custom_shop_id { get; set; }
        public int shop_id { get; set; }
        public string count_in { get; set; }
        public string count_out { get; set; }
        public int timekey { get; set; }
    }

}

Тогда в этом примере, просто используя назначение набора записей и включенный просмотрщик данных, чтобы вы могли видеть, как отдельные строки возвращаются:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...