我有一些很深的Json结构,如下面通过线路传入C#应用程序::
[
{
"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());
也就是说,我将“result”反序列化为JObject,然后将其序列化为文本,然后将其反序列化为Hashtable。
有没有办法将JObject直接转换为Hashtable,或者将结构嵌套在json文本中,就像“结果”一样嵌入到Hashtable中?上述方法有效,但我讨厌它的笨拙。
答案 0 :(得分: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>();
关于事物的命名和排序/嵌套,它可能有点过分,所以要小心。