Десериализовать JSON в пользовательский объект, используя .NET - PullRequest
2 голосов
/ 14 декабря 2011

Ответ:

Мне удалось выяснить мою собственную проблему. Я думаю, что проблема была связана с тем фактом, что мой Json был в формате массива, но я этого не осознавал.

Я попытался использовать другой класс сериализации, следуя за человеком, который разместил здесь . Новый класс выдал исключение, указывающее, что он не готов десериализовать массивы или что-то в этом роде.

Вот полученный код:

return new JavaScriptSerializer().Deserialize<IList<HubspotObject>>(inputContent);

Оригинальный вопрос:

Я впервые пытаюсь десериализовать данные из фида json из hubspot в конкретный объект. Я использую пример из этого проекта codepot , чтобы помочь выполнить работу.

Я получаю все нулевые свойства после попытки десериализации кода, и я просто не знаю, как с этим справиться.

Вот пример json:

[{
    "blogTitle":"Practice blog",
    "feedUrl":"http://feeds2.feedburner.com/asdf",
    "guid":"asdf5-33f2-4a32-9495-8cd93f1f8252",
    "jsonUrl":"https://hubapi.com/blog/v1/asdf-33f2-4a32-9495-8cd93f1f8252.json",
    "moderated":false,
    "moderators":["asdf@asdf.com"],
    "portalId":42494,"webUrl":"blog.asdf.com/blog"
}]

Вот мой класс:

using System;
using System.Runtime.Serialization;


namespace Json
{
[DataContract()]
public class HubspotObject : IExtensibleDataObject
{
    [DataMember(Name = "authorDisplayName")]
    public string AuthorDisplayName { get; set; }

    [DataMember(Name = "authorEmail")]
    public string Link { get; set; }

    [DataMember(Name = "blogGuid")]
    public string BlogId { get; set; }

    [DataMember(Name = "body")]
    public string Body { get; set; }

    [DataMember(Name = "createTimestamp")]
    public int TimeStamp { get; set; }

    [DataMember(Name = "draft")]
    public bool Draft { get; set; }

    [DataMember(Name = "guid")]
    public string Guid { get; set; }

    [DataMember(Name = "jsonUrl")]
    public string JsonUrl { get; set; }

    [DataMember(Name = "lastUpdateTimestamp")]
    public int LastUpdate { get; set; }

    [DataMember(Name = "metaDescription")]
    public string MetaDescription { get; set; }

    [DataMember(Name = "metaKeywords")]
    public string MetaKeywords { get; set; }

    [DataMember(Name = "portalId")]
    public int PortalId { get; set; }

    [DataMember(Name = "postAnalytics")]
    public PostAnalytics PostAnalytics { get; set; }

    [DataMember(Name = "publishTimestamp")]
    public int PublishTimestamp { get; set; }

    [DataMember(Name = "sendNotifications")]
    public bool SendNotifications { get; set; }

    [DataMember(Name = "summary")]
    public string Summary { get; set; }

    [DataMember(Name = "tags")]
    public string[] Tags { get; set; }


    [DataMember(Name = "title")]
    public string Title { get; set; }

    [DataMember(Name = "url")]
    public string Url { get; set; }

    // WCF stores any items we did not map here
    public ExtensionDataObject ExtensionData { get; set; }
}
[DataContract()]
public class PostAnalytics : IExtensibleDataObject
{
    [DataMember(Name = "comments")]
    public int Comments { get; set; }

    [DataMember(Name = "inboundLinks")]
    public int InboundLinks { get; set; }

    [DataMember(Name = "views")]
    public int Views { get; set; }

    // WCF stores any items we did not map here
    public ExtensionDataObject ExtensionData { get; set; }
}

}

И, наконец, вот строка, где я десериализую:

using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(inputContent)))
        {
            // Convert the stream buffer to an object with our serializer.
            return serializer.ReadObject(stream) as HubspotObject;
        }

Опять же, все объекты обнуляются в этом после десериализации. Нет никаких исключений. Если я устанавливаю атрибут одного из свойств как «обязательный», он выдает исключение, когда не заполняется, что заставляет меня думать, что я как-то неправильно его анализирую.

Предложения? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Несколько недель назад я боролся с десериализацией, и кто-то здесь рекомендовал использовать Json.net

http://james.newtonking.com/projects/json-net.aspx

Мне показалось, что его легко установить и он работает, я думаю, что на вашем простом примере с json вы легко сможете десериализовать его всего за несколько строк кода, используя json.net

1 голос
/ 14 декабря 2011

Попробуйте это:

   // Set the position to the beginning of the stream.
   stream.Seek(0, SeekOrigin.Begin);
   return serializer.ReadObject(stream) as HubspotObject;

отсюда: http://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=vs.71%29.aspx

Я сталкивался с подобными случаями использования потоков для чтения xml: он считывает весь поток в операторе using, поэтому перед попыткой считывания его в объект необходимо установить исходную точку потока обратно в начало.

0 голосов
/ 14 декабря 2011

Я смог выяснить свою проблему. Я думаю, что проблема была связана с тем фактом, что мой Json был в формате массива, но я этого не осознавал.

Я попытался использовать другой класс сериализации, следуя за человеком, который разместил здесь . Новый класс выдал исключение, указывающее, что он не готов десериализовать массивы или что-то в этом роде.

Вот полученный код:

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