2013-06-27 47 views
0

我正在編寫代碼以測試jsonasmx Web服務中返回C#。返回的響應是以下格式:將從ASMX服務返回的JSON轉換爲C#對象列表

{"d":"[{\"Id\":\"row1\",\"TheDate\":\"01/01/2013 00:00:00\",\"Description\":\"Test1\",\"Field\":\"N\"},  
     {\"Id\":\"row2\",\"TheDate\":\"01/01/2013 00:00:00\",\"Description\":\"Test2\",\"Field\":\"N\"}] 

最後,我想將數據轉換爲對象的列表。我受限於使用JSON.Net

在我轉換json瞬間返回的響應JArray使用下面的方法:

private static JArray ConvertToJsonArray(StreamReader reader) 
{ 
    var json = reader.ReadToEnd(); 

    string result = json.Replace("{\"d\":\"", string.Empty); 
    result = result.Replace(@"\", string.Empty); 
    result = result.Replace("]\"}", "]"); 

    return JArray.Parse(result); 
} 

正如你所看到的,我做了很多的字符串手動格式,使其最終可以解析。

然後,我循環並在JArray中取每個JObject,並在將其添加到列表之前轉換爲所需的對象類型。

這確實給了我想要的結果,但我覺得必須有更優雅的解決方案。

任何人都可以請幫忙嗎?

PS - 爲了簡潔起見,我留了很多代碼。如果需要,我可以提供更多細節。

+2

您是否擁有對asmx Web服務的控制權?它看起來來自該服務的結果正在雙重序列化(這就是爲什麼你有那裏的所有反斜槓)。如果您可以修復Web服務而不是雙重序列化響應,那麼在解析它之前,您不必對字符串進行任何按摩。如果不是,那麼恐怕你沒有太多選擇。 –

+1

我同意@Brian Rogers,它似乎是您在asmx中手動序列化。 查看此博客文章的詳細信息: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/ –

+0

謝謝。是的,這似乎是問題。我現在不在代碼中,但會稍後再看並更新。 – davy

回答

0

感謝Brian RogersTanim Salem(見上述評論)

我做了更改Web服務,這樣纔不雙系列化。

我現在可以簡化代碼是這樣的:

private static JArray ConvertToJsonArray(string json) 
    {   
     var jsonObject = JObject.Parse(json);     
     return (JArray)jsonObject["d"]; 
    } 

,然後用它轉化爲我的對象列表:

private static IList<ThirdPartyClaim> ConvertJsonArrayToListOfClaims(JArray jsonArray) 
    { 
     return JsonConvert.DeserializeObject<List<ThirdPartyClaim>>(jsonArray.ToString());   
    } 

其他任何評論或改進,將不勝感激。