2011-09-04 88 views
7

我有以下JSON從Java服務JSON.NET根標籤和反序列化

{"Test":{ 
    "value": 1, 
    "message": "This is a test" 
    }} 

我有以下的C#類

class Test { 
    public int value { get; set; } 
    public String message { get; set; } 
} 

然而,因爲根標籤「測試」是一個返回返回我不能直接反序列化這與

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString); 

我發現我必須包裝在另一個測試類這個班的工作。有沒有一種簡單的方法可以避免這種情況?

JToken root = JObject.Parse(jsonString); 
JToken testToken = root["Test"]; 
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString()); 

最後我還有第二個問題。我調用的大多數服務也可以返回一個Exception對象。我想我會讀取JSON的「根」標記以確定如何反序列化對象。我如何獲得第一個根標籤和/或是否有更好,更優雅的方法來處理服務中的異常?

由於

回答

1

如果你不想創建你可以使用匿名類型的包裝類型:

var test = 
    JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test; 

如果您有更多的屬性,如一個例外,它可能是最好創建一個包裝類型。

1

只需編寫一個包裝:

public class Wrapper 
{ 
    public Test Test { get; set; } 
} 

,然後反序列化到這個包裝,並通過Test屬性獲取Test實例:

Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test; 
2

響應實際上是一個對象包含Test對象。所以你的對象模型看起來應該是一樣的。而且,由於響應可以包含一個異常時,應當觀照它:

class Response 
{ 
    public Test Test { get; set; } 
    public JObject Exception { get; set; } 
} 

這是假設你不知道會有怎樣的Exception樣子。如果是這樣,請使用具體類型而不是JObject。然後,您可以根據Exception是否爲null來處理對象Response

+0

我認爲這可能實際上很好地工作,如果我使它的通用對象(測試對象)。這是解析一個或其他對象的非常簡單的方法。謝謝 – Shaun

2

有同樣的問題,真的想擺脫這個「容器」中,發現了這種解決方案雖然你需要使用一個額外的字符串來找到根對象:

// Container I wanted to discard 
public class TrackProfileResponse 
{ 
    [JsonProperty("response")] 
    public Response Response { get; set; } 
} 

// Code for discarding it 
var jObject = JObject.Parse(s); 
var jToken = jObject["response"]; 
var response = jToken.ToObject<Response>();