1

以下のようなやや深い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 にデシリアライズし、それをテキストにシリアライズしてから、ハッシュテーブルにデシリアライズしています。

JObject を直接 Hashtable に変換する方法、または「結果」のような構造を JSON テキストに深くネストして Hashtable にする方法はありますか? 上記のアプローチは機能しますが、私はそのぎこちなさが嫌いです。

4

1 に答える 1

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>();

名前付けと順序付け/入れ子については少し難しいかもしれないので注意してください。

于 2011-02-25T16:35:37.987 に答える