2011-12-13 3 views
2

Deserialize JSON в пользовательский объект с использованием .NET

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

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

Вот результирующий код, который работал:

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

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

Я пытаюсь десериализации данных из Hubspot подачи JSon на мой первый раз в конкретный объект. Я использую пример от this codespot project, чтобы помочь выполнить работу.

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

Вот пример 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":["[email protected]"], 
    "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; 
     } 

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

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

ответ

0

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

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

Вот результирующий код, который работал:

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

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

// 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: он читает весь поток в использовании заявление, так что вы должны установить контрольную точку потока обратно в начало, прежде чем пытаться прочитать его в объекте.

+0

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

1

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

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

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

+0

Спасибо за ваше предложение. Я просто получил этот пример, но я еще не слишком многому научился. Я проверю json-net и посмотрю, в чем дело. – letsgetsilly