我使用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";
}
}
答案 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()));