указание десериализации в Json.NET - PullRequest
1 голос
/ 25 февраля 2011

У меня есть несколько глубокая структура 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 для начала? Вышеуказанный подход работает, но я ненавижу его грубость.

1 Ответ

0 голосов
/ 25 февраля 2011

то, что вы хотите сделать, это десериализовать объект, представляющий 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>();

, это может быть немного финскио наименовании и порядке / вложенности вещей, так что будьте осторожны.

...