2011-02-25 39 views
1

指定反序列化我有句話深深的JSON結構像下面進入過線到C#應用程序:在Json.NET

[ 
{ 
    "status": "ok", 
    "node": "vm2", 
    "type": "message", 
    "result": { 
     "tx.mqid": "amq.gen-+Phq5acfC9kbs7Ch/0cUUw==", 
     "tx.time": 1297273910, 
     "tx.id": 28 
    } 
} 
... 
] 

我在做反序列化這樣的:

List<Hashtable> des = JsonConvert.DeserializeObject<List<Hashtable>>(objs); 

現在,我需要從上面的結構中提取「結果」字典。

這樣做的問題是,它並不總是存在。它可能會被別的東西取代,尤其是。當發生錯誤時。此外,結果可能會根據Json客戶端調用的函數而改變。所以我真的不能說明它在靜態的方式是這樣的:

JsonConvert.DeserializeObject<List<Hashtable<Hashtable>>> 

現在我在做反序列化在有些愚蠢的方式,像這樣:

JObject nodeResult = (JObject)nodeRec["result"]; 
Hashtable nrh = JsonConvert.DeserializeObject<Hashtable>(nodeResult.ToString()); 

也就是說,我反序列化「結果」到JObject中,然後將其序列化爲文本,然後將其反序列化爲Hashtable。

有沒有什麼辦法可以直接將JObject轉換成Hashtable,或者將結構深深地嵌入json文本中,比如「result」到Hashtable中?上述方法有效,但我討厭它的笨拙。

回答

0

你想要做的是反序列化爲表示json的對象。

[DataContract] 
class JSONResponse { 
    [DataMember] 
    public string status {get;set;} 
    [DataMember] 
    public string node {get;set;} 
    [DataMember] 
    public string type {get;set;} 
    [DataMember] 
    public Hashtable<Result> result {get;set;} 
} 
[DataContract] 
class Result { 
    [DataMember] 
    public string tx.mqid {get;set;} 
    [DataMember] 
    public string tx.time {get;set;} 
    [DataMember] 
    public string tx.id {get;set;} 
} 

,然後更新您的反序列化的代碼本

JSONResponse response = JsonConvert.DeserializeObject<JSONReponse>(); 

它可以是一個有點finnicky關於命名和排序/事物嵌套,所以要小心。