Reputation: 190
I'll excuse myself in advance for such a long post, fact of the matter is that I have no clue as to where the problem might persist.
I'm working on a program that is required to pull deals - with custom fields - related to a selected organization out of PipeDrive, do some calculations and save the results as a document. Currently it does the following:
I've got this part down, it works perfectly. However, when I worked out the second part of the requirements, things get weird. I will elaborate the steps carefully:
When an organization is clicked, query the API for deals corresponding to the organization ID and name.
public List<int> GetOrgDealcodes(string ID, string search)
{
List<int> returnlist = new List<int>();
JsonTextReader reader = new JsonTextReader(new StringReader((string)ReturnObjectsByName(PipeLineNiveau.deals, search, ID)));
reader.SupportMultipleContent = true;
JsonSerializer serializer = new JsonSerializer();
serializer.ObjectCreationHandling = ObjectCreationHandling.Replace;
try
{
PipeDriveDeals.RootObject root = serializer.Deserialize<PipeDriveDeals.RootObject>(reader);
foreach (PipeDriveDeals.data tmp in root.data)
{
returnlist.Add(tmp.id);
}
}
catch (JsonException ex)
{
Error.TopBar("Deserializing error", ex.Message);
}
return returnlist;
}
ReturnObjectsByName()
returns an object
containing the JSON response
Get details of each of the deal ID's returned.
public PipeDriveDeals.data GetDeal(string ID)
{
PipeDriveDeals.data returnvar = new PipeDriveDeals.data();
JsonTextReader reader = new JsonTextReader(new StringReader((string)ReturnObject(PipeLineNiveau.deals, ID)));
reader.SupportMultipleContent = true;
JsonSerializer serializer = new JsonSerializer();
serializer.ObjectCreationHandling = ObjectCreationHandling.Replace;
try
{
returnvar = serializer.Deserialize<PipeDriveDeals.data>(reader);
}
catch(Exception ex)
{
Error.TopBar("Error reading deal", ex.ToString());
}
return returnvar;
}
ReturnObject()
returns an object
containing the JSON response
Deserialize the returned JSON in a class generated with JSON2CSharp (shown in GetDeal()), meaning this:
{
"success": true,
"data": {
"id": 1,
"user_id": {
"id": [censored],
"name": "[censored]",
"email": "administratie@[censored]",
"has_pic": false,
"pic_hash": null,
"value": [censored]
},
"person_id": {
"name": "[censored]",
"email": "[censored]@[censored]",
"phone": "[censored]",
"value": 1
},
"org_id": {
"name": "Test",
"people_count": 1,
"cc_email": "[censored][email protected]",
"value": 1
},
"stage_id": 13,
"title": "Test deal",
"value": 200,
"currency": "EUR",
"add_time": "2015-04-23 13:40:42",
"update_time": "2015-05-21 15:34:39",
"stage_change_time": "2015-04-29 08:29:35",
"active": false,
"deleted": true,
"status": "deleted",
"next_activity_date": null,
"next_activity_time": null,
"next_activity_id": null,
"last_activity_id": null,
"last_activity_date": null,
"lost_reason": null,
"visible_to": "3",
"close_time": "2015-05-21 15:34:39",
"pipeline_id": 2,
"won_time": null,
"lost_time": null,
"products_count": 2,
"files_count": 1,
"notes_count": 1,
"followers_count": 1,
"email_messages_count": null,
"activities_count": null,
"done_activities_count": null,
"undone_activities_count": null,
"reference_activities_count": null,
"participants_count": 1,
"expected_close_date": null,
"f97e4841747d1fc621809ebbd0063f52f4eecf74": "Person",
"052d4ce58edf16df90dab070591bd070f8ad88e7": "27-02-1992",
"28fb37b17020f6dbd45ee92c94ae34811e94edd8": "Company",
"a1032d833c7cba5a18ca09cd5418bfa3fd919137_currency": "EUR",
"d7c2cb45d01c81159dd684111aa41bbbe5ce6db5_currency": "EUR",
"d54e4d7b41a5bdfb2a29f7d57d8c1a4fd2ece115_currency": "EUR",
"267976bb28be655ecf0bed63efbf4822b75aa0cf_currency": "EUR",
"28e42860f533c6837224736257b963f3d8418ad1": "Company",
"211a67285816fc5179c248ef08e52000a2d1b15b_currency": "EUR",
"1697fe1baa42670ccebdb863bc03729b56d8857d_currency": "EUR",
"4dc8edc835c39dbe422f3e1dd14f2fa3072866a8_currency": "EUR",
"54dce1f16a984fa7d62e9c31c4c09d8832c0e423_currency": "EUR",
"8985469f141b2df5f3236947983feea015d24145": "3,4,5",
"05a20487e9aa7a069f678aa2af92be5c75675416": null,
"275ac9794b3f274c1c61b47033b298d94a0125fd": null,
"24363789868fc8fada2400a3644cb11f7683df04": null,
"0670e6a82e67e19166f11c11778229d783395d0f": null,
"3b0feefce60bc79e9d9fb15bc20c57a05e0ebff8": null,
"d3748987f13e9dcdd60ffc6a567d3fd80431d77f": null,
"c4fbdf6431406db25949cdd90dfc91eeb5295165": null,
"c357146d49b62fe08d34bbc98550b2b96431f773": null,
"91bd07ed77e652cf6ac4a8b82c83e7e9932dbff3": null,
"235d277ff53390255c6c505a1634c88646fa3748": null,
"5c06d93f2b2ef968478235270d24c91b90cd857d": null,
"0b8350fa9af813124cf6d039ef2c932297fb1b49": null,
"547d1d42798933363859853e775d42974080a291": null,
"08610b715244a8ddfb3aeb1b4585c4487afd67bd": null,
"88ea9aadb49d3b4da1d17d2224e6d4b82a532a40": null,
"49eba2416e95c88ac3ec279a1534884429872d21": null,
"817f3b1c7ac9220fca3a9275926dabdfb914d885": null,
"206f941b5d992f43d5123b2a42c34db758ecc826": null,
"60a22e72ff54fa91b04376d6c373f35da19d94ba_currency": null,
"1326c4f84ec8611a202cc58a66d091617b910b4d": null,
"e13d704375bb3ee3c4523ba2e1e2f79779329615": null,
"d9bc80190727512287a4951e160b0f81d8b8f227": null,
"7cafce1dd6b89b14f69c23d9f1f56e8f67a8c00b": null,
"a451543d82d05cd98464d2c8b4141f95038e7e55": null,
"67fcb1f393b0bff6c83d43414cd432b695a4d9c2": null,
"3776ab9561a6f50d3becfd63aae885a3f9a6ce86": null,
"0f3c7cb8eda95298a7e17cc4c5b6aea1fed99476": null,
"b5039fda6e758955f6aefcdf86bc654fd2e7d8bd": null,
"5c194672d7994903077944047cec441673e7b1e6": null,
"f04a5560d8e408620c633230e141bf16a6874b30": null,
"2502aab37117657e5fe04c2ce688b80b8e7aa17f": null,
"ef704e3b5bc356ebceb81f00628e5813b8ecf2e5": null,
"f4aaa546fb4bc886aed645789ccaaebad4fe60d8": null,
"eefb3dbc53aa0d99ef0a57a864af562f6f6de49a": null,
"5144ea977b5678f238d5aa11418510c18efcf4fc": null,
"stage_order_nr": 5,
"person_name": "Person",
"org_name": "Test",
"next_activity_subject": null,
"next_activity_type": null,
"next_activity_duration": null,
"next_activity_note": null,
"formatted_value": "€ 200",
"weighted_value": 190,
"formatted_weighted_value": "€ 190",
"rotten_time": null,
"owner_name": "[censored]",
"cc_email": "[censored][email protected]",
"org_hidden": false,
"person_hidden": false,
"average_time_to_won": {
"y": 0,
"m": 0,
"d": 0,
"h": 0,
"i": 0,
"s": 0,
"total_seconds": 0
},
"average_stage_progress": 0,
"age": {
"y": 0,
"m": 1,
"d": 17,
"h": 18,
"i": 18,
"s": 28,
"total_seconds": 4126708
},
"stay_in_pipeline_stages": {
"times_in_stages": {
"1": 435229,
"2": 0,
"3": 0,
"4": 63812,
"9": 692,
"10": 0,
"11": 0,
"12": 0,
"13": 3626975
},
"order_of_stages": [
11,
12,
13,
10,
9,
2,
3,
4,
1
]
},
"last_activity": null,
"next_activity": null
},
"additional_data": {
"dropbox_email": "[censored][email protected]"
},
"related_objects": {
"organization": {
"1": {
"id": 1,
"name": "Test",
"people_count": 1,
"cc_email": "[censored][email protected]"
}
},
"user": {
"[censored]": {
"id": [censored],
"name": "[censored]",
"email": "administratie@[censored]",
"has_pic": false,
"pic_hash": null
}
},
"person": {
"1": {
"id": 1,
"name": "Person",
"email": "[censored]@[censored]",
"phone": "[censored]"
}
}
}
}
to this:
class PipeDriveDeals
{
public class UserId
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public bool has_pic { get; set; }
public object pic_hash { get; set; }
public int value { get; set; }
}
public class PersonId
{
public string name { get; set; }
public string email { get; set; }
public object phone { get; set; }
public int value { get; set; }
}
public class OrgId
{
public string name { get; set; }
public int people_count { get; set; }
public string cc_email { get; set; }
public int value { get; set; }
}
public class __invalid_type__0f3c7cb8eda95298a7e17cc4c5b6aea1fed99476
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public bool has_pic { get; set; }
public string pic_hash { get; set; }
public int value { get; set; }
}
public class AverageTimeToWon
{
public int y { get; set; }
public int m { get; set; }
public int d { get; set; }
public int h { get; set; }
public int i { get; set; }
public int s { get; set; }
public int total_seconds { get; set; }
}
public class Age
{
public int y { get; set; }
public int m { get; set; }
public int d { get; set; }
public int h { get; set; }
public int i { get; set; }
public int s { get; set; }
public int total_seconds { get; set; }
}
public class TimesInStages
{
public int pref_11 { get; set; }
public int pref_12 { get; set; }
}
public class StayInPipelineStages
{
public TimesInStages times_in_stages { get; set; }
public List<int> order_of_stages { get; set; }
}
public class data
{
public int id { get; set; }
public int user_id { get; set; }
public int person_id { get; set; }
public int org_id { get; set; }
public int stage_id { get; set; }
public string title { get; set; }
public int value { get; set; }
public string currency { get; set; }
public string add_time { get; set; }
public string update_time { get; set; }
public string stage_change_time { get; set; }
public bool active { get; set; }
public bool deleted { get; set; }
public string status { get; set; }
public DateTime next_activity_date { get; set; }
public DateTime next_activity_time { get; set; }
public int next_activity_id { get; set; }
public int last_activity_id { get; set; }
public DateTime last_activity_date { get; set; }
public string lost_reason { get; set; }
public string visible_to { get; set; }
public DateTime close_time { get; set; }
public int pipeline_id { get; set; }
public DateTime won_time { get; set; }
public DateTime lost_time { get; set; }
public int products_count { get; set; }
public int files_count { get; set; }
public int notes_count { get; set; }
public int followers_count { get; set; }
public int email_messages_count { get; set; }
public int activities_count { get; set; }
public int done_activities_count { get; set; }
public int undone_activities_count { get; set; }
public int reference_activities_count { get; set; }
public int participants_count { get; set; }
public DateTime expected_close_date { get; set; }
[JsonProperty(PropertyName = "f97e4841747d1fc621809ebbd0063f52f4eecf74")]
public string f97e4841747d1fc621809ebbd0063f52f4eecf74 { get; set; }
[JsonProperty(PropertyName = "052d4ce58edf16df90dab070591bd070f8ad88e7")]
public string pref_052d4ce58edf16df90dab070591bd070f8ad88e7 { get; set; }
[JsonProperty(PropertyName = "28fb37b17020f6dbd45ee92c94ae34811e94edd8")]
public string pref_28fb37b17020f6dbd45ee92c94ae34811e94edd8 { get; set; }
[JsonProperty(PropertyName = "a1032d833c7cba5a18ca09cd5418bfa3fd919137_currency")]
public string a1032d833c7cba5a18ca09cd5418bfa3fd919137_currency { get; set; }
[JsonProperty(PropertyName = "d7c2cb45d01c81159dd684111aa41bbbe5ce6db5_currency")]
public string d7c2cb45d01c81159dd684111aa41bbbe5ce6db5_currency { get; set; }
[JsonProperty(PropertyName = "d54e4d7b41a5bdfb2a29f7d57d8c1a4fd2ece115_currency")]
public string d54e4d7b41a5bdfb2a29f7d57d8c1a4fd2ece115_currency { get; set; }
[JsonProperty(PropertyName = "267976bb28be655ecf0bed63efbf4822b75aa0cf_currency")]
public string pref_267976bb28be655ecf0bed63efbf4822b75aa0cf_currency { get; set; }
[JsonProperty(PropertyName = "28e42860f533c6837224736257b963f3d8418ad1")]
public string pref_28e42860f533c6837224736257b963f3d8418ad1 { get; set; }
[JsonProperty(PropertyName = "211a67285816fc5179c248ef08e52000a2d1b15b_currency")]
public string pref_211a67285816fc5179c248ef08e52000a2d1b15b_currency { get; set; }
[JsonProperty(PropertyName = "1697fe1baa42670ccebdb863bc03729b56d8857d_currency")]
public string pref_1697fe1baa42670ccebdb863bc03729b56d8857d_currency { get; set; }
[JsonProperty(PropertyName = "4dc8edc835c39dbe422f3e1dd14f2fa3072866a8_currency")]
public string pref_4dc8edc835c39dbe422f3e1dd14f2fa3072866a8_currency { get; set; }
[JsonProperty(PropertyName = "54dce1f16a984fa7d62e9c31c4c09d8832c0e423_currency")]
public string pref_54dce1f16a984fa7d62e9c31c4c09d8832c0e423_currency { get; set; }
[JsonProperty(PropertyName = "8985469f141b2df5f3236947983feea015d24145")]
public string pref_8985469f141b2df5f3236947983feea015d24145 { get; set; }
[JsonProperty(PropertyName = "05a20487e9aa7a069f678aa2af92be5c75675416")]
public string pref_05a20487e9aa7a069f678aa2af92be5c75675416 { get; set; }
[JsonProperty(PropertyName = "275ac9794b3f274c1c61b47033b298d94a0125fd")]
public string pref_275ac9794b3f274c1c61b47033b298d94a0125fd { get; set; }
[JsonProperty(PropertyName = "24363789868fc8fada2400a3644cb11f7683df04")]
public string pref_24363789868fc8fada2400a3644cb11f7683df04 { get; set; }
[JsonProperty(PropertyName = "0670e6a82e67e19166f11c11778229d783395d0f")]
public string pref_0670e6a82e67e19166f11c11778229d783395d0f { get; set; }
[JsonProperty(PropertyName = "3b0feefce60bc79e9d9fb15bc20c57a05e0ebff8")]
public string pref_3b0feefce60bc79e9d9fb15bc20c57a05e0ebff8 { get; set; }
[JsonProperty(PropertyName = "d3748987f13e9dcdd60ffc6a567d3fd80431d77f")]
public string d3748987f13e9dcdd60ffc6a567d3fd80431d77f { get; set; }
[JsonProperty(PropertyName = "c4fbdf6431406db25949cdd90dfc91eeb5295165")]
public string c4fbdf6431406db25949cdd90dfc91eeb5295165 { get; set; }
[JsonProperty(PropertyName = "c357146d49b62fe08d34bbc98550b2b96431f773")]
public int c357146d49b62fe08d34bbc98550b2b96431f773 { get; set; }
[JsonProperty(PropertyName = "91bd07ed77e652cf6ac4a8b82c83e7e9932dbff3")]
public string pref_91bd07ed77e652cf6ac4a8b82c83e7e9932dbff3 { get; set; }
[JsonProperty(PropertyName = "235d277ff53390255c6c505a1634c88646fa3748")]
public string pref_235d277ff53390255c6c505a1634c88646fa3748 { get; set; }
[JsonProperty(PropertyName = "5c06d93f2b2ef968478235270d24c91b90cd857d")]
public string pref_5c06d93f2b2ef968478235270d24c91b90cd857d { get; set; }
[JsonProperty(PropertyName = "0b8350fa9af813124cf6d039ef2c932297fb1b49")]
public string pref_0b8350fa9af813124cf6d039ef2c932297fb1b49 { get; set; }
[JsonProperty(PropertyName = "547d1d42798933363859853e775d42974080a291")]
public string pref_547d1d42798933363859853e775d42974080a291 { get; set; }
[JsonProperty(PropertyName = "08610b715244a8ddfb3aeb1b4585c4487afd67bd")]
public string pref_08610b715244a8ddfb3aeb1b4585c4487afd67bd { get; set; }
[JsonProperty(PropertyName = "88ea9aadb49d3b4da1d17d2224e6d4b82a532a40")]
public string pref_88ea9aadb49d3b4da1d17d2224e6d4b82a532a40 { get; set; }
[JsonProperty(PropertyName = "49eba2416e95c88ac3ec279a1534884429872d21")]
public string pref_49eba2416e95c88ac3ec279a1534884429872d21 { get; set; }
[JsonProperty(PropertyName = "817f3b1c7ac9220fca3a9275926dabdfb914d885")]
public string pref_817f3b1c7ac9220fca3a9275926dabdfb914d885 { get; set; }
[JsonProperty(PropertyName = "206f941b5d992f43d5123b2a42c34db758ecc826")]
public string pref_206f941b5d992f43d5123b2a42c34db758ecc826 { get; set; }
[JsonProperty(PropertyName = "60a22e72ff54fa91b04376d6c373f35da19d94ba_currency")]
public string pref_60a22e72ff54fa91b04376d6c373f35da19d94ba_currency { get; set; }
[JsonProperty(PropertyName = "1326c4f84ec8611a202cc58a66d091617b910b4d")]
public string pref_1326c4f84ec8611a202cc58a66d091617b910b4d { get; set; }
[JsonProperty(PropertyName = "e13d704375bb3ee3c4523ba2e1e2f79779329615")]
public string e13d704375bb3ee3c4523ba2e1e2f79779329615 { get; set; }
[JsonProperty(PropertyName = "d9bc80190727512287a4951e160b0f81d8b8f227")]
public string d9bc80190727512287a4951e160b0f81d8b8f227 { get; set; }
[JsonProperty(PropertyName = "7cafce1dd6b89b14f69c23d9f1f56e8f67a8c00b")]
public string pref_7cafce1dd6b89b14f69c23d9f1f56e8f67a8c00b { get; set; }
[JsonProperty(PropertyName = "a451543d82d05cd98464d2c8b4141f95038e7e55")]
public string a451543d82d05cd98464d2c8b4141f95038e7e55 { get; set; }
[JsonProperty(PropertyName = "67fcb1f393b0bff6c83d43414cd432b695a4d9c2")]
public string pref_67fcb1f393b0bff6c83d43414cd432b695a4d9c2 { get; set; }
[JsonProperty(PropertyName = "3776ab9561a6f50d3becfd63aae885a3f9a6ce86")]
public string pref_3776ab9561a6f50d3becfd63aae885a3f9a6ce86 { get; set; }
[JsonProperty(PropertyName = "0f3c7cb8eda95298a7e17cc4c5b6aea1fed99476")]
public __invalid_type__0f3c7cb8eda95298a7e17cc4c5b6aea1fed99476 pref_0f3c7cb8eda95298a7e17cc4c5b6aea1fed99476 { get; set; }
[JsonProperty(PropertyName = "b5039fda6e758955f6aefcdf86bc654fd2e7d8bd")]
public string b5039fda6e758955f6aefcdf86bc654fd2e7d8bd { get; set; }
[JsonProperty(PropertyName = "5c194672d7994903077944047cec441673e7b1e6")]
public string pref_5c194672d7994903077944047cec441673e7b1e6 { get; set; }
[JsonProperty(PropertyName = "f04a5560d8e408620c633230e141bf16a6874b30")]
public double f04a5560d8e408620c633230e141bf16a6874b30 { get; set; }
[JsonProperty(PropertyName = "2502aab37117657e5fe04c2ce688b80b8e7aa17f")]
public double pref_2502aab37117657e5fe04c2ce688b80b8e7aa17f { get; set; }
[JsonProperty(PropertyName = "ef704e3b5bc356ebceb81f00628e5813b8ecf2e5")]
public string ef704e3b5bc356ebceb81f00628e5813b8ecf2e5 { get; set; }
[JsonProperty(PropertyName = "f4aaa546fb4bc886aed645789ccaaebad4fe60d8")]
public string f4aaa546fb4bc886aed645789ccaaebad4fe60d8 { get; set; }
[JsonProperty(PropertyName = "5144ea977b5678f238d5aa11418510c18efcf4fc")]
public string pref_5144ea977b5678f238d5aa11418510c18efcf4fc { get; set; }
[JsonProperty(PropertyName = "eefb3dbc53aa0d99ef0a57a864af562f6f6de49a")]
public string pref_eefb3dbc53aa0d99ef0a57a864af562f6f6de49a { get; set; }
public int stage_order_nr { get; set; }
public string person_name { get; set; }
public string org_name { get; set; }
public string next_activity_subject { get; set; }
public string next_activity_type { get; set; }
public string next_activity_duration { get; set; }
public string next_activity_note { get; set; }
public string formatted_value { get; set; }
public int weighted_value { get; set; }
public string formatted_weighted_value { get; set; }
public string rotten_time { get; set; }
public string owner_name { get; set; }
public string cc_email { get; set; }
public bool org_hidden { get; set; }
public bool person_hidden { get; set; }
public AverageTimeToWon average_time_to_won { get; set; }
public int average_stage_progress { get; set; }
public Age age { get; set; }
public StayInPipelineStages stay_in_pipeline_stages { get; set; }
public string last_activity { get; set; }
public string next_activity { get; set; }
}
public class AdditionalData
{
public string dropbox_email { get; set; }
}
public class __invalid_type__509734
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public bool has_pic { get; set; }
public object pic_hash { get; set; }
}
public class User
{
public __invalid_type__509734 pref_509734 { get; set; }
}
public class __invalid_type__22964
{
public int id { get; set; }
public string name { get; set; }
public int people_count { get; set; }
public string cc_email { get; set; }
}
public class Organization
{
public __invalid_type__22964 pref_22964 { get; set; }
}
public class __invalid_type__30607
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public object phone { get; set; }
}
public class Person
{
public __invalid_type__30607 pref_30607 { get; set; }
}
public class RelatedObjects
{
public User user { get; set; }
public Organization organization { get; set; }
public Person person { get; set; }
}
public class RootObject
{
public bool success { get; set; }
public List<data> data { get; set; }
public AdditionalData additional_data { get; set; }
public RelatedObjects related_objects { get; set; }
}
}
When debugging I see that the request is correct, the returned data is exactly what I expect (as shown in step three) and during deserializing the buffer is filled with said data, but it does not fill the returnvar
class with the expected values:
I have no clue why this is happening, after all I have two other interactions with the PipeDrive API that use the exact same methods, have a very similar implementation, and work just fine.
I also noticed that PipeDrive uses randomized strings as identification for custom fields. Some of them tend to start with a number, which means it's not possible to create a variable with the same name (hence the pref_
and __invalid_type__
prefixes). I've attempted to work around this by setting JsonProperty
. Could this be the problem and does my workaround not suffice?
Upvotes: 0
Views: 1180
Reputation: 190
I'm late, but it seems fair to post the answer for those that deal with a similar problem: turns out it was a rookie mistake after all. The answer to this mistake was that I tried to fill out the data
class rather than the RootObject
, which would never work given the hierarchy.
Upvotes: 0