2013-09-09 2 views
0

Итак, вот что происходит: я получил эту JSon строку (после загрузки изображения в Imgur, используя их API):Weird поведение с JsonConverter

{ 
    "data": { 
     "id": "123456", 
     "title": null, 
     "description": null, 
     "datetime": 1378731002, 
     "type": "image/png", 
     "animated": false, 
     "width": 1600, 
     "height": 900, 
     "size": 170505, 
     "views": 0, 
     "bandwidth": 0, 
     "favorite": false, 
     "nsfw": null, 
     "section": null, 
     "deletehash": "qZPqgs7J1jddVdo", 
     "link": "http://i.imgur.com/123456.png" 
    }, 
    "success": true, 
    "status": 200 
} 

Я пытаюсь десериализации в словарь, используя JsonConvert.DeserializeObject как это:

richTextBox1.Text = json; 
Dictionary<string, string> dic = JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 
MessageBox.Show(dic["success"].ToString()); 

Дело в том, что я могу видеть строку JSON на RichTextBox, но MessageBox после JsonConvert никогда не появляется ... Что я здесь отсутствует?

На самом деле, я даже могу поставить точку останова после JsonCOnvert, она не будет запущена. Что происходит?

спасибо.

+0

«Странное поведение» на самом деле не доступно для поиска. Можете ли вы поделиться с нами некоторой информацией об отладке, сообщениями об ошибках или чем-то более описательным, чем «странным поведением»? –

ответ

2

Я думаю, что вы получаете исключение при десериализации. Вы можете использовать this site и преобразовать свой json в конкретный класс.

var obj = JsonConvert.DeserializeObject<RootObject>(json); 

public class Data 
{ 
    public string id { get; set; } 
    public object title { get; set; } 
    public object description { get; set; } 
    public int datetime { get; set; } 
    public string type { get; set; } 
    public bool animated { get; set; } 
    public int width { get; set; } 
    public int height { get; set; } 
    public int size { get; set; } 
    public int views { get; set; } 
    public int bandwidth { get; set; } 
    public bool favorite { get; set; } 
    public object nsfw { get; set; } 
    public object section { get; set; } 
    public string deletehash { get; set; } 
    public string link { get; set; } 
} 

public class RootObject 
{ 
    public Data data { get; set; } 
    public bool success { get; set; } 
    public int status { get; set; } 
} 

Вы также можете использовать JObject, так как implemets IDictionary

var dic = JObject.Parse(json); 
MessageBox.Show(dic["success"].ToString()); 
+0

Я пробовал это, но строка json не всегда в одном формате. Когда загрузка завершится неудачей, класс Data будет заменен классом Error с разными свойствами ... Поэтому я решил, что лучше найти другой способ. Когда я вернусь домой, я попробую сделать второй путь. Благодаря! – Marcelo

+0

Это сработало! Еще раз спасибо. – Marcelo

+0

@Marcelo - это путь к благодарности. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – I4V

0

Может быть, вы должны попробовать использовать Dictionary<string, object>, потому что ценности не всегда являются строками. Кажется, что есть исключение, когда вы вызываете json deserializer.

Возможно, вы можете окружить свой код блоком «try-catch», чтобы поймать исключение.