2014-08-28 347 views
-1

我有一个从API调用返回了以下JSON:转换JObject到custome实体 - C#

{ 
    "Success": true, 
    "Message": null, 
    "Nodes": [ 
     { 
      "Title": "Title 1", 
      "Link": "http://www.google.com", 
      "Description": null, 
      "PubDate": "2014-06-19T13:32:00-07:00" 
     }, 
     { 
      "Title": "Title 2", 
      "Link": "http://www.bing.com", 
      "Description": null, 
      "PubDate": "2014-06-26T13:14:00-07:00" 
     }, 

    ] 
} 

我有以下对象到JSON转换为自定义对象

[JsonObject(MemberSerialization.OptIn)] 
public class MyApiResponse 
{ 
    [JsonProperty(PropertyName = "Success")] 
    public bool Success { get; set; } 

    [JsonProperty(PropertyName = "Message")] 
    public string Message { get; set; } 

    [JsonProperty(PropertyName = "Nodes")] 
    public IEnumerable<object> Nodes { get; set; } 
} 

我能够执行以下代码行以反序列化到MyApiResponse对象。

MyApiResponse response = JsonConvert.DeserializeObject<MyApiResponse>(json); 

我想通过MyApiResponse对象可以序列化他们到另一个物体的Nodes财产循环。当我尝试下面的代码片段,它抛出一个错误:

foreach(var item in response.Nodes) 
{ 
    MyObject obj = JsonConvert.DeserializeObject<MyObject>(item.ToString()); 
} 

什么我需要做的item转换成我MyObjectforeach循环?

+0

所以你的问题是,为什么它抛出的错误?如果是,请提供错误消息。或者你的问题是:我需要做什么来将项目转换成foreach循环中的MyObject?如果这样,因为你将它声明为MyApiResponse类中的节点,所以如果你想改变为别的东西,肯定需要将其转换为 – 2014-08-28 01:12:27

+0

@ah_hau - 当我尝试循环遍历时,它看起来像是抛出HTTP 500错误'Nodes'属性将它们转换为'MyObject'数据类型 – 2014-08-28 01:42:05

+0

可以发布更多代码吗? HTTP 500内部服务器错误是通用服务器错误,如果您已经收到您的回复,为什么它仍然调用Web功能?你的JsonConvert调用了在线托管的第三方转换器吗? – 2014-08-28 01:47:08

回答

1

你只需要定义一个类来表示一个节点,然后更改Nodes财产在你MyApiResponse类是List<Node>(或IEnumerable<Node>,如果你喜欢),而不是IEnumerable<object>。当您拨打JsonConvert.DeserializeObject<MyApiResponse>(json)时,整个JSON响应会一次反序列化。应该不需要单独对每个子项目进行反序列化。

[JsonObject(MemberSerialization.OptIn)] 
public class Node 
{ 
    [JsonProperty(PropertyName = "Title")] 
    public string Title { get; set; } 

    [JsonProperty(PropertyName = "Link")] 
    public string Link { get; set; } 

    [JsonProperty(PropertyName = "Description")] 
    public string Description { get; set; } 

    [JsonProperty(PropertyName = "PubDate")] 
    public DateTime PubDate { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class MyApiResponse 
{ 
    [JsonProperty(PropertyName = "Success")] 
    public bool Success { get; set; } 

    [JsonProperty(PropertyName = "Message")] 
    public string Message { get; set; } 

    [JsonProperty(PropertyName = "Nodes")] 
    public List<Node> Nodes { get; set; } 
} 

然后:

MyApiResponse response = JsonConvert.DeserializeObject<MyApiResponse>(json); 

foreach (Node node in response.Nodes) 
{ 
    Console.WriteLine(node.Title); 
}