Десериализовать комплекс JSON на C # - PullRequest
0 голосов
/ 08 ноября 2019

Я получаю этот объект из API

{
        "addedAt": 1573172075745,
        "vid": 12590024,
        "canonical-vid": 12590024,
        "merged-vids": [],
        "portal-id": 62515,
        "is-contact": true,
        "profile-token": "AO_T-mOW3t21rXoDQIhBpPulGUoTyxQKLbBxaHrS2P3MsXjF4qFJ9BIvIgkVDpeha5P3GHujF8FOP-0XFRndATAU_YogQKRBTDddOFx8s_DITNLUrnfU07QCwW61HUPygEAyDeNG6N8d",
        "profile-url": "https://app.hubspot.com/contacts/62515/contact/12590024",
        "properties": {
            "firstname": {
                "value": "Matt"
            },
            "lastmodifieddate": {
                "value": "1573172075745"
            },
            "company": {
                "value": "HubSpot"
            },
            "lastname": {
                "value": "Schnitt"
            }
        }
    }

и пытаюсь заполнить эту модель

class UserProperties
{
    public string firstname { get; set; }
    public DateTime lastmodifieddate { get; set; }
    public string company { get; set; }
    public string lastname { get; set; }
}
class UserForDeserialize
{
    public int vid { get; set; }
    public List<UserProperties> properties { get; set; }
}

этим кодом

class ApiControl
{
    public void GetAllUsers()   
    {
        using (var client = new WebClient())
        {
            client.Headers.Add("Content-Type:application/json");
            client.Headers.Add("Accept:application/json");

            var result = client.DownloadString("https://api.hubapi.com/contacts/v1/lists/recently_updated/contacts/recent?hapikey=demo&count=2");

            JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
            dynamic dobj = jsonSerializer.Deserialize<dynamic>(result);
            var obf = dobj["contacts"]; 

            foreach (var item in obf)
            {
                var exampleModel = jsonSerializer.Deserialize<UserForDeserialize>(json);
            }
            Console.Read();
        }
    }
}

Идентификатор заполнен, но списокСвойства имеют все нулевые свойства. Может быть, это из-за поля «value» внутри каждого свойства, но я не могу найти хорошее решение для этого. Что я могу попробовать десериализовать JSON?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Похоже, модель, сгенерированная из json, неверна. Я использовал json2csharp для конвертации вашего json, и модель выглядела следующим образом

public class Firstname
{
    public string value { get; set; }
}

public class Lastmodifieddate
{
    public string value { get; set; }
}

public class Company
{
    public string value { get; set; }
}

public class Lastname
{
    public string value { get; set; }
}

public class Properties
{
    public Firstname firstname { get; set; }
    public Lastmodifieddate lastmodifieddate { get; set; }
    public Company company { get; set; }
    public Lastname lastname { get; set; }
}

public class UserForDeserialize
{
    public int vid { get; set; }
    public Properties properties { get; set; }
}

После этого я могу прочитать свойства

using (StreamReader r = new StreamReader(filename))
{
   string json = r.ReadToEnd();
   var obj = JsonConvert.DeserializeObject<UserForDeserialize>(json);
   Console.WriteLine(obj.properties.firstname);
}
0 голосов
/ 08 ноября 2019

Измените тип ваших свойств в 'UserProperties' для другого класса, который содержит:

public string value { get; set; }

Поскольку вам не хватает этого свойства внутри вашего объекта UserProperties, я думаю, что это основная проблема, с которой вы сталкиваетесьс участием.

0 голосов
/ 08 ноября 2019

Ваш класс должен быть таким.

public class Root
{
    public long addedAt { get; set; }
    public int vid { get; set; }
    public int canonicalvid { get; set; }
    public object[] mergedvids { get; set; }
    public int portalid { get; set; }
    public bool iscontact { get; set; }
    public string profiletoken { get; set; }
    public string profileurl { get; set; }
    public Properties properties { get; set; }
}

public class Properties
{
    public Firstname firstname { get; set; }
    public Lastmodifieddate lastmodifieddate { get; set; }
    public Company company { get; set; }
    public Lastname lastname { get; set; }
}

public class Firstname
{
    public string value { get; set; }
}

public class Lastmodifieddate
{
    public string value { get; set; }
}

public class Company
{
    public string value { get; set; }
}

public class Lastname
{
    public string value { get; set; }
}

и затем десериализовать с помощью этого.

JavaScriptSerializer js = new JavaScriptSerializer();  
Root rootObject = js.Deserialize<Root>(result );  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...