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:
- Query the API for companies using textbox input as keyword.
- Deserialize the returned JSON in a class generated with JSON2CSharp.
- Put results in a list.
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 anobjectcontaining the JSON responseGet 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 anobjectcontaining the JSON responseDeserialize 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; }
}
}
- Process everything in different classes in order to calculate and print results. (this code is irrelevant to the question)
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?
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
dataclass rather than theRootObject, which would never work given the hierarchy.