RESTful API 在 SSIS 包中调用

RESTful API call in SSIS package

作为 SSIS (2005) 包的一部分,我通过脚本组件 (VB.NET) 调用 RESTful API。我正在恢复记录。我遇到的问题是处理它返回的格式,以便我可以在数据流中输出它(拆分成单独的输出列)并写入 SQL table。不知道从哪里开始 - 有人有什么想法吗?我无法控制 API,所以只能使用这种格式。

这里是根据 API 文档的架构:

{StatusMessage : <string>, Unit : <string> [ { VehicleID : <int>, RegistrationNumber : <string>, DistanceTravelled : <double>} ] }

这里是返回数据的示例(它以单行文本形式返回):

{"VehicleDistance":
   [
    {
       "VehicleId":508767,
       "RegistrationNumber":"BJ63 NYO",
       "DistanceTravelled":0.09322560578584671
    },
    {
       "VehicleId":508788,
       "RegistrationNumber":"BJ63 NYL",
       "DistanceTravelled":6.1591048240661621
    },
    {
      "VehicleId":508977,
      "RegistrationNumber":"PE12 LLC",
      "DistanceTravelled":60.975761413574219
    },
    {
      "VehicleId":510092,
      "RegistrationNumber":"BJ64 FCY",
      "DistanceTravelled":14.369173049926758
    },
    {
      "VehicleId":510456,
      "RegistrationNumber":"BJ63 NYY",
      "DistanceTravelled":4.04599142074585
    },
    {
      "VehicleId":513574,
      "RegistrationNumber":"BL64 AEM",
      "DistanceTravelled":302.150390625
    }
  ],
  "StatusMessage":null,
  "Unit":"imperial",
  "HttpStatus":200
  }

这是 Javscript Object Notation AKA JSON,您需要反序列化它。问题是使用 SSIS 与流行(且快速)的第三方工具很棘手,但 VB.Net 实际上有一个内置的 class 来序列化和反序列化 JSON 称为 JavaScriptSerializer

首先为您的项目添加一个名为 System.Web.Extensions 的引用,然后您可以使用 JavaScriptSerializer 反序列化您的 JSON。

我已经把你的 JSON 放在一个文件中以便于处理,所以首先我必须...

Dim sJSON As String = ""

Using swReadFile As New System.IO.StreamReader("E:\JSON.txt")
    sJSON = swReadFile.ReadToEnd()
End Using

剩下的是相关位,所以首先添加 2 个导入...

Imports System.Collections.Generic
Imports System.Web.Script.Serialization

那么例如我们可以...

Dim lvSerializer As JavaScriptSerializer = New JavaScriptSerializer()

lvSerializer.MaxJsonLength = 2147483644

Dim dictParsedJSONPairs As Dictionary(Of String, Object) = lvSerializer.Deserialize(Of Dictionary(Of String, Object))(sJSON)

If dictParsedJSONPairs.ContainsKey("VehicleDistance") AndAlso _
   TypeOf dictParsedJSONPairs("VehicleDistance") Is ArrayList Then

    Dim ArrayEntries As ArrayList = DirectCast(dictParsedJSONPairs("VehicleDistance"), ArrayList)

    For Each ArrayEntry As Object In ArrayEntries

        Dim DictEntry As Dictionary(Of String, Object) = DirectCast(ArrayEntry, Dictionary(Of String, Object))

        If DictEntry.ContainsKey("VehicleId") Then Console.WriteLine("VehichleId:" & DictEntry("VehicleId"))

    Next

End If

If dictParsedJSONPairs.ContainsKey("Unit") Then
    Console.WriteLine("Unit is " & dictParsedJSONPairs.Item("Unit"))
End If

显然,您应该在投入正式使用之前研究 JSON。该对象可以嵌套 JSON(即 Dictionary(Of String, Object))、某种数字、字符串或 ArrayList

可能有点晚了,但您可能想看看来自 Newtonsoft (website) 的 json.net。提供的组件包含.Net 2.0版本。

在 SSIS 脚本任务中使用它非常简单。我在基于 .Net 3.5 的 SSIS2008 中完成了解析 JSON 字符串,如下所示。并且根据文档,它也应该适用于 .Net 2.0 版本。

//I assume you had obtained JSON in string format
string JasonBuffer;

//define Json object
JObject jObject = JObject.Parse(JasonBuffer);

//In my example the Json object starts with result  
JArray Results = (JArray)jObject["result"]; 

//loop the result
foreach (JObject Result in Results)  
{  
   //for simple object
   JObject joCustomer = (JObject)Result["Customer"];
   //do something...

   //for complex object continue drill down 
   foreach (JObject joSection in Result["Sections"])       
   {
       foreach (JObject joDepartment in joSection["Departments"])  
       {  

         foreach (JObject joItem in joDepartment["Items"])  
         {  

         }  

您可以在此处找到一些实际代码:link