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
作为 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