2011-12-13 2 views
2

Réponse:Désérialise JSON en objet personnalisé en utilisant .NET

J'ai été en mesure de résoudre mon propre problème. Je pense que la question avait à voir avec le fait que mon Json était dans un format de tableau, mais je ne m'en suis pas rendu compte.

J'ai essayé d'utiliser une classe de sérialisation différente en suivant la personne qui a posté here. La nouvelle classe a jeté une exception indiquant qu'elle n'était pas prête à désérialiser les tableaux, ou quelque chose à cet effet.

Voici le code résultant qui a fonctionné:

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

question d'origine:

Je tente de désérialiser données pour la première fois à partir d'un flux JSON de HubSpot dans un objet concret. J'utilise l'exemple de this codespot project pour aider à faire le travail.

Je reçois toutes les propriétés null après avoir tenté de désérialiser le code, et je ne suis tout simplement pas sûr de savoir comment résoudre ce problème.

Voici un exemple de 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" 
}] 

Voici ma classe:

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; } 
} 

}

Et enfin, voici la ligne où je deserialize:

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; 
     } 

Encore une fois, un Tous les objets sont nuls après désérialisation. Aucune exception n'est levée. Si je mets l'attribut de l'une des propriétés à "required", il lance une exception quand il ne remplit pas, ce qui me fait penser que je l'analyse mal, d'une manière ou d'une autre.

Suggestions? Merci d'avance.

Répondre

0

J'ai été capable de comprendre mon propre problème. Je pense que la question avait à voir avec le fait que mon Json était dans un format de tableau, mais je ne m'en suis pas rendu compte.

J'ai essayé d'utiliser une classe de sérialisation différente en suivant la personne qui a posté here. La nouvelle classe a jeté une exception indiquant qu'elle n'était pas prête à désérialiser les tableaux, ou quelque chose à cet effet.

Voici le code résultant qui a fonctionné:

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

Essayez ceci:

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

d'ici: http://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=vs.71%29.aspx

J'ai rencontré occurences similaires en utilisant des flux pour lire xml: il lit tout le flux dans l'instruction à l'aide, vous devez régler la point de référence du flux de retour au début avant d'essayer de le lire dans un objet.

+0

Merci pour votre réponse, je lui ai donné un coup de feu à aucun effet. Je suis intéressé par d'autres idées, je ne sais toujours pas comment résoudre ce problème, je suis si peu familier avec ces cours. – letsgetsilly

1

je luttais avec désérialisation il y a quelques semaines et que quelqu'un ici a recommandé d'utiliser Json.net

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

Je l'ai trouvé facile à installer et obtenu ce travail, je pense que votre exemple simple JSON vous Je devrais facilement pouvoir le désérialiser avec juste quelques lignes de code en utilisant json.net

+0

Merci pour votre suggestion. Je viens de faire fonctionner cet exemple, mais je n'ai pas encore appris grand chose. Je vais vérifier json-net et voir de quoi il s'agit. – letsgetsilly

Questions connexes