【问题标题】:specifying deserialization in Json.NET在 Json.NET 中指定反序列化
【发布时间】:2011-02-25 16:30:32
【问题描述】:

我有一些深层次的 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());

也就是说,我将“结果”反序列化为JObject,然后将其序列化为文本,再将其反序列化为Hashtable。

有什么方法可以将 JObject 直接转换为 Hashtable,或者将结构嵌套在 json 文本中,如“result”开始转换为 Hashtable?上述方法可行,但我讨厌它的笨拙。

【问题讨论】:

    标签: c# json deserialization


    【解决方案1】:

    您要做的是反序列化为一个代表 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>();
    

    关于事物的命名和排序/嵌套可能有点麻烦,所以要小心。

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多