2011-12-13 111 views
2

答案:使用.NET将JSON反序列化为自定义对象

我能弄清楚我自己的问题。我认为这个问题与我的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; 
     } 

同样,a在反序列化之后,这些对象中的所有对象都是null。没有例外抛出。如果我将其中一个属性的属性设置为“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此类事件再度发生:它读取using语句全码流,所以你必须设置在尝试将其读入对象之前,流的参考点返回到开头。

+0

感谢您的答复,我给它一个镜头,没有效果。我对任何更多的想法感兴趣,我仍然不确定如何解决这个问题,我对这些课程非常不熟悉。 – letsgetsilly 2011-12-13 22:56:23

1

我与反序列化在几个星期前,有人挣扎在使用这里推荐Json.net

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

我发现它易于安装和得到它的工作,我想与你简单的JSON例子中,你应该很容易能够使用json.net只需几行代码就可以反序列化它

+0

感谢您的建议。我刚刚得到了这个例子,但我还没学到太多东西。我会检查json-net并查看它的全部内容。 – letsgetsilly 2011-12-14 16:47:25

相关问题