如何从HubSpot反序列化JSON

时间:2019-04-16 07:36:34

标签: c# json hubspot

我无法反序列化从HubSpot ContactList API接收的JSON。

我正在使用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
}

如果我只是简单地请求vid,我就可以正确得到2个vid。是在我尝试做属性时,我失败了。

请帮助

2 个答案:

答案 0 :(得分:1)

让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();

Live Demo

答案 1 :(得分:0)

为大型和嵌套键/值对json创建和管理类结构是繁琐的任务

所以一种方法是改用JToken

您只需将JSON解析为JToken并通过querying解析的对象,就可以轻松读取所需的数据,而无需为json创建类结构

在您的帖子中,您似乎需要从json中检索vidproperties,因此请尝试以下代码,

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