简体   繁体   English

在 SSIS 中使用 C# 从 JSON API 读取

[英]Reading from JSON API with C# in SSIS

I want to read some data from a JSON API in SSIS and write it to a table in SQL Server.我想从 SSIS 中的 JSON API 读取一些数据并将其写入 SQL Server 中的表中。 I've solved the task using a 3rd party, but the solution isn't that elegant, so now I'm trying to script it myself in Visual Studio using SSIS's script component.我已经使用 3rd 方解决了这个任务,但解决方案不是那么优雅,所以现在我尝试使用 SSIS 的脚本组件在 Visual Studio 中自己编写脚本。

I've researched around the web for solutions, and ended with this result.我在网上研究了解决方案,并以这个结果结束。 So far, I'm fairly confident about what is going on, but I lack the final direction for this.到目前为止,我对正在发生的事情相当有信心,但我缺乏最终的方向。 I know I need to somehow map the output to the columns I've created in SSIS.我知道我需要以某种方式将输出映射到我在 SSIS 中创建的列。 I guess I have to do something around CreateNewOutputRows() , but I'm not sure what.我想我必须围绕CreateNewOutputRows()做一些事情,但我不确定是什么。 Can someone please help me out on this?有人可以帮我解决这个问题吗? Also, since this is more or less my first ever c# script, I would also appreciate it, if there's a way easier solution OR if it is in some way inappropriate etc.此外,由于这或多或少是我的第一个 c# 脚本,如果有更简单的解决方案或在某些方面不合适等,我也将不胜感激。

First of all, the output from the API looks like this (API documentation here) :首先,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
      }

The script I've got so far is我到目前为止的脚本是

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()
    {

    }

}

You'll put all that code in CreateNewOutputRows() . 您将把所有代码放在CreateNewOutputRows()

First you have to manually add all the columns to the script component. 首先,您必须手动将所有列添加到脚本组件。 In the example here I only added 2 columns: 在这里的示例中,我只添加了2列:

在此输入图像描述

The code goes in CreateNewOutPutRows(). 代码在CreateNewOutPutRows()中。 I don't have Newtonsoft, just using the JavaScriptSerializer here to show a working example so you can see how to hook it up: 我没有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; }
    }

}

Then in this example, just using a record set destination and enabled data viewer so you can see the individuals rows come back out: 然后在此示例中,只使用记录集目标和启用的数据查看器,以便您可以看到个别行返回:

在此输入图像描述

I am not sure why people would down vote but anyway.我不确定为什么人们会拒绝投票,但无论如何。

I am at the exact same point and stuck at a point where trying to understand how to handle nulls since I have null written to some of the columns.我处于完全相同的点,并停留在试图了解如何处理空值的点上,因为我将空值写入了某些列。

[{
        "name": "Dutral BTX 8148 WO",
        "id": 7047,
        "categoryName": "Polymer",
        "categoryId": 1,
        "specificGravity": "0.87"
    },
    
    
    {
        "name": "Shot Size",
        "id": 6245,
        "categoryName": null,
        "categoryId": null,
        "specificGravity": null
    }]

Question -问题 -

How can you handle null for any of the column ?您如何处理任何列的空值?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM