2013-08-27 95 views
2

我正在調用一個以JSON格式返回響應的API,我無法控制它的響應。如何解析JSON?

它產生的反應是類似於以下

{ 
   "success": "Yes", 
   "resource": "Job/record", 
   "count": 2, 
   "last-modified": "2013-06-20 10:21:53", 
   "Job": { 
      "1297585": { 
         "link": {}, 
         "last-modified": "2013-06-20 10:21:53", 
         "id": "1297585" 
      }, 
      "1319244": { 
         "link": {}, 
         "last-modified": "2013-06-20 10:21:53", 
         "id": "1319244" 
      } 
   } 
} 

我使用HttpWebRequest和HttpWebResponse得到這個JSON。我需要將其序列化爲POCO,並有兩個問題。

  1. 響應包含上次修改屬性如何轉換 在C#類LastModified屬性。
  2. 其次,最重要的是job數組包含一個帶id的動態屬性。如何將動態值(如1319244)轉換爲嵌套對象中的ID屬性。

我想得到一個類似於下面的poco。

public class Response 
    { 
     public String Success { get; set; } 
     public String Resource { get; set; } 
     public Int32 Count { get; set; } 
     public DateTime LastModified { get; set; } 
     public Job[] Jobs { get; set; } 
    } 

    public class Job 
    { 
     public Int32 ID { get; set; } 
     public String Link { get; set; } 
     public String LastModified { get; set; } 
    } 

我需要手動解析此響應還是有任何簡單的方法?

回答

0

我結束了使用JSON。手動Net並反序列化Json。結果沒有什麼大不了的。

下面是代碼

var jo = JObject.Parse(json); 
     var data = (JObject)jo["Job"]; 
     foreach (var item in data) 
     { 
      JToken token = JToken.Parse(item.Value.ToString()); 

      Console.WriteLine(token.Value<String>("id")); 
     } 

我所要做的就是閱讀作業對象,然後使用循環遍歷它。在循環內我可以讀取任何屬性並將其分配給我的POCO。

+1

只需簡單的說明 - 每次您都不需要重新解析循環內的「item」。你可以簡單地做'JToken token = item.Value'。 –

1
  1. 您可以通過JsonProperty屬性指定在JSON中使用的名稱裝飾你的C#的屬性不同名稱的JSON和C#的屬性相關聯。

  2. 如果您有包含動態屬性名稱的對象,你需要使用一個Dictionary<string,X>接收反序列化值,其中X爲object,或者你定義一個類(我建議後者儘可能)。

考慮到這些點,你可以定義你的類是這樣的:

public class Response 
{ 
    [JsonProperty(PropertyName = "success")] 
    public String Success { get; set; } 

    [JsonProperty(PropertyName = "resource")] 
    public String Resource { get; set; } 

    [JsonProperty(PropertyName = "count")] 
    public Int32 Count { get; set; } 

    [JsonProperty(PropertyName="last-modified")] 
    public DateTime LastModified { get; set; } 

    [JsonProperty(PropertyName = "Job")] 
    public Dictionary<string, Job> Jobs { get; set; } 
} 

public class Job 
{ 
    [JsonProperty(PropertyName = "id")] 
    public Int32 ID { get; set; } 

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

    [JsonProperty(PropertyName = "last-modified")] 
    public String LastModified { get; set; } 
} 

而且你可以反序列化到他們這樣的:

Response responseObj = JsonConvert.DeserializeObject<Response>(jsonString); 
+0

謝謝Brian。我結束了使用Json.Net,因爲它是一個非常流行的庫,非常易於使用。我相信你的代碼能夠正常工作,但我沒有采用這種方法的唯一原因是由於我個人的喜好,而不是其他任何東西。 –

+0

沒問題;使用JSON.Net的LINQ-to-JSON功能(您的方法)也是完成同樣任務的完美方法。 –