JsonConverter的奇怪行为

时间:2013-09-09 12:57:12

标签: c# json

所以这就是发生了什么:我得到了这个json字符串(在使用他们的API将图像上传到imgur之后):

{
    "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反序列化为Dictionary,如下所示:

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

事情是,我可以看到RichTextBox上的json字符串,但JsonConvert之后的MessageBox从未出现......我在这里缺少什么?

事实上,我甚至可以在JsonCOnvert之后设置一个断点,它不会被触发。发生了什么事?

谢谢。

2 个答案:

答案 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,因为它实现了IDictionary

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

答案 1 :(得分:0)

也许你应该尝试使用Dictionary<string, object>,因为值并不总是字符串。 当你调用json反序列化器时,似乎有一个例外。

也许你可以使用“try-catch”块来包围你的代码,以便捕获异常。