解析JSON时应用程序崩溃

时间:2014-03-08 04:46:29

标签: c# json

我使用Newtonsoft.JSON从网站获取一些JSON数据

之前,当我只解析1个值时,一切正常。最近,我需要更多,所以我现在正在解析3个值。不幸的是,现在它花费的时间比正常情况要多(为什么会发生?没有下载JSON字符串吗?)而且,它在很长一段时间后崩溃了。堆栈显示它在Settings1_Load

崩溃

代码就在这里 -

public void Settings1_Load(object sender, System.EventArgs e)
{
    using (var webClient = new System.Net.WebClient())
    {
        var json = webClient.DownloadString("http://backpack.tf/api/IGetPrices/v3/?format=json&key=53195ef54dd7b8a9088b4567");
        Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.Parse(json);
        value = (double)o["response"]["prices"][DefindexS]["6"]["0"]["current"]["value"];
        price = (double)o["response"]["prices"][DefindexS]["6"]["0"]["current"]["value"];
        currency = (string)o["response"]["prices"][DefindexS]["6"]["0"]["current"]["currency"];
        keyvalue = (double)o["response"]["prices"]["5021"]["6"]["0"]["current"]["value"];

    }
    LoadText();        
}

public void LoadText()
{

    txtUsername.Text = UsernameS;
    txtPassword.Text = PasswordS;
    txtName.Text = DisplayNameS;
    txtPrefix.Text = PrefixS;
    txtBackpack.Text = BackpackS;
    txtSell.Text = AnyUserHandler.SellPricePerItem.ToString();
    txtBuy.Text = AnyUserHandler.BuyPricePerItem.ToString();
    txtDefindex.Text = DefindexS;
    textBox1.Text = NameS;
    if (currency == "metal")
    {
        lblPrice.Text = "Price: " + value.ToString() + " ref";
    }
    else if (currency == "keys")
    {
        lblPrice.Text = "Price: " + value.ToString() + " keys";
    }

}

我收到此错误 - http://gyazo.com/e41baf3f17ccb6de1776eeefb74f8174

2 个答案:

答案 0 :(得分:2)

我明白了。

我没有使用引号格式化realdef,而是使用了DefindexS.ToString()并且它有效

value = (double)o["response"]["prices"][DefindexS.ToString()]["6"]["0"]["current"]["value"];

这有效^

答案 1 :(得分:1)

您可能应该查看JSON结果,看看您要查找的实际值是否与您的代码的顺序相同。

但为了简单起见,尝试创建一个具体类并使用JSON.Net对其进行反序列化,并按照断点来验证反序列化对象是否准确。您甚至可以使用http://json2csharp.com/

自动创建课程

关于使用变量DefindexS

的问题

使用:

[String.Format("\"{0}\"", DefindexS.ToString())] 

而不是

[DefindexS]

我认为需要在这里使用JObject.GetValue方法(String)。

而不是:

value = (double)o["response"]["prices"][DefindexS]["6"]["0"]["current"]["value"];

使用:

value = (decimal)o.SelectToken(string.Format("response.prices.{0}.6.0.current.value", DefindexS.ToString()));