Edition - 5/8 échantillon Json:SSIS Script Component JSON DataContractJsonSerializer
{
"data": [
{
"evidenceId": "9999A999-9D99-4411-8819-DD55D9DDD55D",
"status": "Active",
"title": "Video 2017-04-30 2354",
"idExternal": null,
"description": null,
"dateUploaded": "2017-05-01T01:33:10.522-06:00",
"dateModified": "2017-05-01T01:33:10.970-06:00",
"dateRecordStart": "2017-04-30T23:54:38.000-06:00",
"dateRecordEnd": "2017-04-30T23:59:10.000-06:00",
"dateDeleted": "2017-08-28T23:54:38.000-06:00",
"evidenceType": "Video",
"flag": "N",
"contentType": "mp4",
"sizeMb": 40.36958312988281,
"durationSeconds": "272.76",
"ownerFirstName": "D B",
"ownerLastName": "ITE",
"ownerBadgeId": "9999",
"ownerRole": "Officer/PSA's",
"ownerGroups": [],
"updatedByFirstName": "",
"updatedByLastName": "",
"updatedByBadgeId": "",
"updatedByRole": "",
"deletedByFirstName": "",
"deletedByLastName": "",
"deletedByBadgeId": "",
"deletedByRole": "",
"uploadedByFirstName": "D B",
"uploadedByLastName": "ITE",
"uploadedByBadgeId": "9999",
"uploadedByRole": "Officer/PSA's",
"gps": {
"latitude": null,
"longitude": null
},
"deviceId": "8888A888-8D88-4411-8819-DD55D9DDD66E",
"notes": [],
"categories": [
"120 Day Deletion"
],
"tags": [],
"cases": [],
"viewCount": 0,
"lastViewedOn": null,
"isReassigned": false,
"authenticatedShareCount": 0,
"deletionType": "",
"checksum": "{sha2}33aa3724c8b3bb647a27fb3a895867c8214508b0cdba6e66882095f22b29f23d",
"downloadCount": 0
},
{
"evidenceId": "7777A777-9E99-4411-8819-EE55E9EEE55E",
"status": "Active",
"title": "Video 2017-04-30 2354",
"idExternal": null,
"description": null,
"dateUploaded": "2017-05-02T01:02:08.180-06:00",
"dateModified": "2017-05-02T01:02:08.530-06:00",
"dateRecordStart": "2017-04-30T23:54:04.000-06:00",
"dateRecordEnd": "2017-05-01T00:01:53.000-06:00",
"dateDeleted": "2017-08-28T23:54:04.000-06:00",
"evidenceType": "Video",
"flag": "N",
"contentType": "mp4",
"sizeMb": 68.5533447265625,
"durationSeconds": "469.03",
"ownerFirstName": "C S",
"ownerLastName": "NARRO",
"ownerBadgeId": "5555",
"ownerRole": "Officer/PSA's",
"ownerGroups": [],
"updatedByFirstName": "",
"updatedByLastName": "",
"updatedByBadgeId": "",
"updatedByRole": "",
"deletedByFirstName": "",
"deletedByLastName": "",
"deletedByBadgeId": "",
"deletedByRole": "",
"uploadedByFirstName": "C S",
"uploadedByLastName": "NARRO",
"uploadedByBadgeId": "5555",
"uploadedByRole": "Officer/PSA's",
"gps": {
"latitude": null,
"longitude": null
},
"deviceId": "2F87080C-8AB2-4BB5-A3F4-E8E51D648B79",
"notes": [],
"categories": [
"120 Day Deletion"
],
"tags": [],
"cases": [],
"viewCount": 0,
"lastViewedOn": null,
"isReassigned": false,
"authenticatedShareCount": 0,
"deletionType": "",
"checksum": "{sha2}47256fe19712a852198a5ac45aef949f4b1ad1011dddc16b6674add514a2d614",
"downloadCount": 0
}
],
}
Edition - 5/5 Informations supplémentaires:
Voici mon code mis à jour pour mon projet actuel. Je peux maintenant voir que j'obtiens des données si je restreins les paramètres à un seul résultat. mais quand j'augmente les résultats je ne peux pas obtenir le foreach pour fonctionner correctement. J'ai dû coder en dur les valeurs du tableau. J'apprécie toute aide pour que cela fonctionne !!
#region Class
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
#region Methods
/// <summary>Outputs records to the output buffer</summary>
public override void CreateNewOutputRows()
{
//Set Webservice URL
string wUrl = "https://api.evidence.com/api/v1/agencies/{partnerId}/reports/data?reportType=EvidenceCreated&fromDate=2017-04-01&toDate=2017-04-30&pageSize=5&pageOffset=0";
try
{
//Call getWebServiceResult to return our Article attributes
RootObject outPutResponse = GetWebServiceResult(wUrl);
//If we get data back
if (outPutResponse != null)
{
foreach (Datum ar in outPutResponse.data)
// {
//Output main attributes of Article
EvidenceBuffer.AddRow();
EvidenceBuffer.evidenceId = outPutResponse.data[0].evidenceId;
EvidenceBuffer.status = outPutResponse.data[0].status;
EvidenceBuffer.title = outPutResponse.data[0].title;
EvidenceBuffer.idExternal = outPutResponse.data[0].idExternal;
EvidenceBuffer.description = outPutResponse.data[0].description;
EvidenceBuffer.dateUploaded = outPutResponse.data[0].dateUploaded;
EvidenceBuffer.dateModified = outPutResponse.data[0].dateModified;
EvidenceBuffer.dateRecordStart = outPutResponse.data[0].dateRecordStart;
EvidenceBuffer.dateRecordEnd = outPutResponse.data[0].dateRecordEnd;
EvidenceBuffer.dateDeleted = outPutResponse.data[0].dateDeleted;
EvidenceBuffer.evidenceType = outPutResponse.data[0].evidenceType;
EvidenceBuffer.flag = outPutResponse.data[0].flag;
EvidenceBuffer.contentType = outPutResponse.data[0].contentType;
EvidenceBuffer.sizeMb = outPutResponse.data[0].sizeMb;
EvidenceBuffer.durationSeconds = outPutResponse.data[0].durationSeconds;
EvidenceBuffer.ownerFirstName = outPutResponse.data[0].ownerFirstName;
EvidenceBuffer.ownerLastName = outPutResponse.data[0].ownerLastName;
EvidenceBuffer.ownerBadgeId = outPutResponse.data[0].ownerBadgeId;
EvidenceBuffer.ownerRole = outPutResponse.data[0].ownerRole;
EvidenceBuffer.ownerGroups = outPutResponse.data[0].ownerGroups;
EvidenceBuffer.updatedByFirstName = outPutResponse.data[0].updatedByFirstName;
EvidenceBuffer.updatedByLastName = outPutResponse.data[0].updatedByLastName;
EvidenceBuffer.updatedByBadgeId = outPutResponse.data[0].updatedByBadgeId;
EvidenceBuffer.updatedByRole = outPutResponse.data[0].updatedByRole;
EvidenceBuffer.deletedByFirstName = outPutResponse.data[0].deletedByFirstName;
EvidenceBuffer.deletedByLastName = outPutResponse.data[0].deletedByLastName;
EvidenceBuffer.deletedByBadgeId = outPutResponse.data[0].deletedByBadgeId;
EvidenceBuffer.deletedByRole = outPutResponse.data[0].deletedByRole;
EvidenceBuffer.uploadedByFirstName = outPutResponse.data[0].uploadedByFirstName;
EvidenceBuffer.uploadedByLastName = outPutResponse.data[0].uploadedByLastName;
EvidenceBuffer.uploadedByBadgeId = outPutResponse.data[0].uploadedByBadgeId;
EvidenceBuffer.uploadedByRole = outPutResponse.data[0].uploadedByRole;
EvidenceBuffer.gpslat = null;
EvidenceBuffer.gpslong = null;
EvidenceBuffer.deviceId = outPutResponse.data[0].deviceId;
EvidenceBuffer.notes = outPutResponse.data[0].notes[0];
EvidenceBuffer.categories = outPutResponse.data[0].categories[0];
EvidenceBuffer.tags = outPutResponse.data[0].tags[0];
EvidenceBuffer.cases = outPutResponse.data[0].cases[0];
EvidenceBuffer.viewCount = outPutResponse.data[0].viewCount;
EvidenceBuffer.lastViewedOn = outPutResponse.data[0].lastViewedOn;
EvidenceBuffer.isReassigned = outPutResponse.data[0].isReassigned;
EvidenceBuffer.authenicatedShareCount = outPutResponse.data[0].authenticatedShareCount;
EvidenceBuffer.deletionType = outPutResponse.data[0].deletionType;
EvidenceBuffer.checksum = outPutResponse.data[0].checksum;
EvidenceBuffer.downloadCount = outPutResponse.data[0].downloadCount;
//}
}
}
catch (Exception e)
{
FailComponent(e.ToString());
}
}
/// <summary>
/// Method to return our list articles
/// </summary>
/// <param name="wUrl">The web service URL to call</param>
/// <returns>An object that contains a list of Articles</returns>
private RootObject GetWebServiceResult(string wUrl)
{
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl);
httpWReq.Headers.Add("Authorization", "Bearer SecretCode");
httpWReq.Method = "GET";
httpWReq.ContentType = "application/json";
HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse();
RootObject jsonResponse = null;
try
{
//Get the stream of JSON
Stream responseStream = httpWResp.GetResponseStream();
//Deserialize the JSON stream
using (StreamReader reader = new StreamReader(responseStream))
{
//Deserialize our JSON
DataContractJsonSerializer sr = new DataContractJsonSerializer(typeof(RootObject));
jsonResponse = (RootObject)sr.ReadObject(responseStream);
}
}
//Output JSON parsing error
catch (Exception e)
{
FailComponent(e.ToString());
}
return jsonResponse;
}
/// <summary>
/// Outputs error message
/// </summary>
/// <param name="errorMsg">Full error text</param>
private void FailComponent(string errorMsg)
{
bool fail = false;
IDTSComponentMetaData100 compMetadata = this.ComponentMetaData;
compMetadata.FireError(1, "Error Getting Data From Webservice!", errorMsg, "", 0, out fail);
}
#endregion
}
#endregion
#region JSON Classes
//Class to hold attributes of the Article
[DataContract]
public class Gps
{
[DataMember(Name = "latitude")]
public object latitude { get; set; }
[DataMember(Name = "longitude")]
public object longitude { get; set; }
}
public class Datum
{
[DataMember(Name = "evidenceId")]
public string evidenceId { get; set; }
[DataMember(Name = "status")]
public string status { get; set; }
[DataMember(Name = "title")]
public string title { get; set; }
[DataMember(Name = "idExternal")]
public string idExternal { get; set; }
[DataMember(Name = "description")]
public string description { get; set; }
[DataMember(Name = "dateUploaded")]
public string dateUploaded { get; set; }
[DataMember(Name = "dateModified")]
public string dateModified { get; set; }
[DataMember(Name = "dateRecordStart")]
public string dateRecordStart { get; set; }
[DataMember(Name = "dateRecordEnd")]
public string dateRecordEnd { get; set; }
[DataMember(Name = "dateDeleted")]
public string dateDeleted { get; set; }
[DataMember(Name = "evidenceType")]
public string evidenceType { get; set; }
[DataMember(Name = "flag")]
public string flag { get; set; }
[DataMember(Name = "contentType")]
public string contentType { get; set; }
[DataMember(Name = "sizeMb")]
public float sizeMb { get; set; }
[DataMember(Name = "durationSeconds")]
public float durationSeconds { get; set; }
[DataMember(Name = "ownerFirstName")]
public string ownerFirstName { get; set; }
[DataMember(Name = "ownerLastName")]
public string ownerLastName { get; set; }
[DataMember(Name = "ownerBadgeId")]
public string ownerBadgeId { get; set; }
[DataMember(Name = "ownerRole")]
public string ownerRole { get; set; }
[DataMember(Name = "ownerGroups")]
public string ownerGroups { get; set; }
[DataMember(Name = "updatedByFirstName")]
public string updatedByFirstName { get; set; }
[DataMember(Name = "updatedByLastName")]
public string updatedByLastName { get; set; }
[DataMember(Name = "updatedByBadgeId")]
public string updatedByBadgeId { get; set; }
[DataMember(Name = "updatedByRole")]
public string updatedByRole { get; set; }
[DataMember(Name = "deletedByFirstName")]
public string deletedByFirstName { get; set; }
[DataMember(Name = "deletedByLastName")]
public string deletedByLastName { get; set; }
[DataMember(Name = "deletedByBadgeId")]
public string deletedByBadgeId { get; set; }
[DataMember(Name = "deletedByRole")]
public string deletedByRole { get; set; }
[DataMember(Name = "uploadedByFirstName")]
public string uploadedByFirstName { get; set; }
[DataMember(Name = "uploadedByLastName")]
public string uploadedByLastName { get; set; }
[DataMember(Name = "uploadedByBadgeId")]
public string uploadedByBadgeId { get; set; }
[DataMember(Name = "uploadedByRole")]
public string uploadedByRole { get; set; }
[DataMember(Name = "gps")]
public Gps gps { get; set; }
[DataMember(Name = "deviceId")]
public string deviceId { get; set; }
[DataMember(Name = "notes")]
public List<string> notes { get; set; }
[DataMember(Name = "categories")]
public List<string> categories { get; set; }
[DataMember(Name = "tags")]
public List<string> tags { get; set; }
[DataMember(Name = "cases")]
public List<string> cases { get; set; }
[DataMember(Name = "viewCount")]
public int viewCount { get; set; }
[DataMember(Name = "lastViewedOn")]
public string lastViewedOn { get; set; }
[DataMember(Name = "isReassigned")]
public bool isReassigned { get; set; }
[DataMember(Name = "authenticatedShareCount")]
public int authenticatedShareCount { get; set; }
[DataMember(Name = "deletionType")]
public string deletionType { get; set; }
[DataMember(Name = "checksum")]
public string checksum { get; set; }
[DataMember(Name = "downloadCount")]
public int downloadCount { get; set; }
}
//Root object that contains a List of data
[DataContract]
public class RootObject
{
[DataMember(Name = "data")]
public List<Datum> data { get; set; }
}
#endregion
Original post:
J'utilise cet exemple pour essayer d'obtenir un package SSIS à consommer d'une API. Je n'ai pas réussi à faire fonctionner mon JSON (et l'API utilisée dans l'échantillon a bougé, donc je n'ai pas pu le faire fonctionner "tel quel") alors j'ai décidé d'essayer quelque chose de facile.
Je suis en train de créer un simple paquet SSIS consommer ces informations de https://swapi.co/api/people/1
Voici mon script:
#region Namespaces
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.IO;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Text;
#endregion
#region Class
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
#region Methods
/// <summary>Outputs records to the output buffer</summary>
public override void CreateNewOutputRows()
{
//Set Webservice URL
//string wUrl = "https://api.evidence.com/api/v1/agencies/3DCB15D3-3770-4DC4-8D22-4FB1FA8619A5/reports/data?reportType=EvidenceCreated&fromDate=2017-04-01&toDate=2017-04-30&pageSize=5&pageOffset=0";
string wUrl = "http://swapi.co/api/people/1";
try
{
//Call getWebServiceResult to return our Article attributes
RootObject outPutResponse = GetWebServiceResult(wUrl);
//If we get data back
if (outPutResponse != null)
{
foreach (People ar in outPutResponse.people)
{
//Output main attributes of Article
PeopleBuffer.AddRow();
PeopleBuffer.name = ar.name;
PeopleBuffer.height = ar.height;
PeopleBuffer.mass = ar.mass;
PeopleBuffer.haircolor = ar.hair_color;
PeopleBuffer.skincolor = ar.skin_color;
PeopleBuffer.eyecolor = ar.eye_color;
PeopleBuffer.birthyear = ar.birth_year;
PeopleBuffer.gender = ar.gender;
PeopleBuffer.homeworld = ar.homeworld;
PeopleBuffer.films = ar.films[0];
PeopleBuffer.species = ar.species[0];
PeopleBuffer.vehicles = ar.vehicles[0];
PeopleBuffer.starships = ar.starships[0];
PeopleBuffer.created = ar.created;
PeopleBuffer.edited = ar.edited;
PeopleBuffer.url = ar.url;
}
}
}
catch (Exception e)
{
FailComponent(e.ToString());
}
}
/// <summary>
/// Method to return our list articles
/// </summary>
/// <param name="wUrl">The web service URL to call</param>
/// <returns>An object that contains a list of Articles</returns>
private RootObject GetWebServiceResult(string wUrl)
{
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl);
//httpWReq.Headers.Add("Authorization", "Bearer HxS35IIN36b9EW64L+GG3xYhoz66bNaD8hsckfQGPdk=");
httpWReq.Method = "GET";
httpWReq.ContentType = "application/json";
HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse();
RootObject jsonResponse = null;
try
{
//Get the stream of JSON
Stream responseStream = httpWResp.GetResponseStream();
//Deserialize the JSON stream
using (StreamReader reader = new StreamReader(responseStream))
{
//Deserialize our JSON
DataContractJsonSerializer sr = new DataContractJsonSerializer(typeof(RootObject));
jsonResponse = (RootObject)sr.ReadObject(responseStream);
}
}
//Output JSON parsing error
catch (Exception e)
{
FailComponent(e.ToString());
}
return jsonResponse;
}
/// <summary>
/// Outputs error message
/// </summary>
/// <param name="errorMsg">Full error text</param>
private void FailComponent(string errorMsg)
{
bool fail = false;
IDTSComponentMetaData100 compMetadata = this.ComponentMetaData;
compMetadata.FireError(1, "Error Getting Data From Webservice!", errorMsg, "", 0, out fail);
}
#endregion
}
#endregion
#region JSON Classes
//Class to hold attributes of the Article
[DataContract]
public class People
{
[DataMember(Name = "name")]
public string name { get; set; }
[DataMember(Name = "height")]
public string height { get; set; }
[DataMember(Name = "mass")]
public string mass { get; set; }
[DataMember(Name = "hair_color")]
public string hair_color { get; set; }
[DataMember(Name = "skin_color")]
public string skin_color { get; set; }
[DataMember(Name = "eye_color")]
public string eye_color { get; set; }
[DataMember(Name = "birth_year")]
public string birth_year { get; set; }
[DataMember(Name = "gender")]
public string gender { get; set; }
[DataMember(Name = "homeworld")]
public string homeworld { get; set; }
[DataMember(Name = "films")]
public List<string> films { get; set; }
[DataMember(Name = "species")]
public List<string> species { get; set; }
[DataMember(Name = "vehicles")]
public List<string> vehicles { get; set; }
[DataMember(Name = "starships")]
public List<string> starships { get; set; }
[DataMember(Name = "created")]
public DateTime created { get; set; }
[DataMember(Name = "edited")]
public DateTime edited { get; set; }
[DataMember(Name = "url")]
public string url { get; set; }
}
//Root object that contains a List of Articles
[DataContract]
public class RootObject
{
[DataMember(Name = "people")]
public List<People> people { get; set; }
}
#endregion
c'est la ligne qui ne fonctionne pas correctement:
jsonResponse = (RootObject)sr.ReadObject(responseStream);
Dans l'image, vous pouvez voir qu'il a ajouté un objet people mais aucune donnée n'est présente.
Je vous serais reconnaissant toute aide à déterminer ce que je dois modifier afin d'obtenir les données dans l'objet de réponse.
Merci!
Edit: Le message d'erreur réelle que le package SSIS donne est:
Error: 0x1 at Data Flow Task, Error Getting Data From Webservice!: System.NullReferenceException: Object reference not set to an instance of an object.
at ScriptMain.CreateNewOutputRows() in c:\Users\E37026\AppData\Local\Temp\Vsta\747a4fee6a1f4610a91610400e06a1ac\main.cs:line 81
De quelle façon vous pouvez fournir un échantillon json désidentifié? – jymbo
@jymbo - voici l'exemple JSON! Je vous remercie! – Leslie
Je l'ai eu pour travailler! J'avais besoin de changer le foreach à un avec une valeur d'index puisque le RootObject est une liste pas une collection !!! – Leslie