Как десериализовать JSON из HubSpot - PullRequest
0 голосов
/ 16 апреля 2019

У меня возникли проблемы с десериализацией JSON, полученного от HubSpot ContactList API.

Я использую Restsharp и NewtonSoft, и у меня возникают серьезные трудности с пониманием того, как правильно определить необходимые классы для десериализации строки JSON, который ниже:

  "contacts": [
    {
      "vid": 2251,
      "portal-id": 5532227,
      "is-contact": true,
      "profile-url": "https://app.hubspot.com/contacts/5532227/contact/2251",
      "properties": {
        "firstname": {
          "value": "Carl"
        },
        "lastmodifieddate": {
          "value": "1554898386040"
        },
        "company": {
          "value": "Cygnus Project"
        },
        "lastname": {
          "value": "Swann"
        }
      },
      "form-submissions": [],
      "identity-profiles": [
        {
          "vid": 2251,
          "saved-at-timestamp": 1553635648634,
          "deleted-changed-timestamp": 0,
          "identities": [
            {
              "type": "EMAIL",
              "value": "cswann@cygnus.co.uk",
              "timestamp": 1553635648591,
              "is-primary": true
            },
            {
              "type": "LEAD_GUID",
              "value": "e2345",
              "timestamp": 1553635648630
            }
          ]
        }
      ],
      "merge-audits": []
    },
    {
      "vid": 2301,
      "portal-id": 5532227,
      "is-contact": true,
      "profile-url": "https://app.hubspot.com/contacts/5532227/contact/2301",
      "properties": {
        "firstname": {
          "value": "Carlos"
        },
        "lastmodifieddate": {
          "value": "1554886333954"
        },
        "company": {
          "value": "Khaos Control"
        },
        "lastname": {
          "value": "Swannington"
        }
      },
      "identity-profiles": [
        {
          "vid": 2301,
          "saved-at-timestamp": 1553635648733,
          "deleted-changed-timestamp": 0,
          "identities": [
            {
              "type": "EMAIL",
              "value": "cswann@khaoscontrol.com",
              "timestamp": 1553635648578,
              "is-primary": true
            },
            {
              "type": "LEAD_GUID",
              "value": "c7f403ba",
              "timestamp": 1553635648729
            }
          ]
        }
      ],
      "merge-audits": []
    }
  ],
  "has-more": false,
  "vid-offset": 2401
}

Если я просто запрашиваю видео, я правильно получаю 2 видео обратно.Это когда я пытаюсь сделать свойства и я получаю ошибку.

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Позволяет уменьшить Json до минимума, чтобы воспроизвести вашу ошибку:

{
    "vid": 2301,
    "portal-id": 5532227,
    "is-contact": true,
    "profile-url": "https://app.hubspot.com/contacts/5532227/contact/2301",
    "properties": {
        "firstname": {
            "value": "Carlos"
        },
        "lastmodifieddate": {
            "value": "1554886333954"
        },
        "company": {
            "value": "Khaos Control"
        },
        "lastname": {
            "value": "Swannington"
        }
    }
}

И соответствующий класс ContactListAPI_Result:

public partial class ContactListAPI_Result
{
    [JsonProperty("vid")]
    public long Vid { get; set; }

    [JsonProperty("portal-id")]
    public long PortalId { get; set; }

    [JsonProperty("is-contact")]
    public bool IsContact { get; set; }

    [JsonProperty("profile-url")]
    public Uri ProfileUrl { get; set; }

    [JsonProperty("properties")]
    public Dictionary<string, Dictionary<string, string>> Properties { get; set; }
}

public partial class ContactListAPI_Result
{
    public static ContactListAPI_Result FromJson(string json) 
        => JsonConvert.DeserializeObject<ContactListAPI_Result>(json);
    //public static ContactListAPI_Result FromJson(string json) 
    //  => JsonConvert.DeserializeObject<ContactListAPI_Result>(json, Converter.Settings);
}

public static void toto()
{
    string input = @"    {
    ""vid"": 2301,
    ""portal-id"": 5532227,
    ""is-contact"": true,
    ""profile-url"": ""https://app.hubspot.com/contacts/5532227/contact/2301"",
    ""properties"": {
        ""firstname"": {
            ""value"": ""Carlos""
        },
        ""lastmodifieddate"": {
            ""value"": ""1554886333954""
        },
        ""company"": {
            ""value"": ""Khaos Control""
        },
        ""lastname"": {
            ""value"": ""Swannington""
        }
    }
}";

    var foo = ContactListAPI_Result.FromJson(input);
}

Но значение одного свойства будет скрытов дополнительном словаре мы можем спроектировать объект в более полезном:

public partial class ItemDTO
{
    public long Vid { get; set; }
    public long PortalId { get; set; }
    public bool IsContact { get; set; }
    public Uri ProfileUrl { get; set; }
    public Dictionary<string, string> Properties { get; set; }
}

Добавление проекции в класс:

public ItemDTO ToDTO()
{
    return new ItemDTO
    {
        Vid = Vid,
        PortalId = PortalId,
        IsContact = IsContact,
        ProfileUrl = ProfileUrl,
        Properties = 
            Properties.ToDictionary(
                p => p.Key, 
                p => p.Value["value"]
            )
    };
}

Использование:

var result = foo.ToDTO();

Демонстрационная версия

0 голосов
/ 16 апреля 2019

Создание и управление структурой классов для большой и вложенной пары ключ / значение json - утомительная задача

Таким образом, один из подходов - использовать JToken.

Вы можете просто проанализировать ваш JSON в JToken и, запросив проанализированный объект , вы легко прочитаете нужные данные, не создавая структуру класса для вашего json

Из вашего поста, похоже, вам нужно извлечь vid и properties из вашего json, поэтому попробуйте следующий код,

string json = "Your json here";

JToken jToken = JToken.Parse(json);

var result = jToken["contacts"].ToObject<JArray>()
    .Select(x => new
    {
        vid = Convert.ToInt32(x["vid"]),
        properties = x["properties"].ToObject<Dictionary<string, JToken>>()
                                    .Select(y => new
                                    {
                                       Key = y.Key,
                                       Value = y.Value["value"].ToString()
                                    }).ToList()
    }).ToList();


//-----------Print the result to console------------

foreach (var item in result)
{
    Console.WriteLine(item.vid);

    foreach (var prop in item.properties)
    {
        Console.WriteLine(prop.Key + " - " + prop.Value);
    }

    Console.WriteLine();
}

Выход:

enter image description here

...