我有一个Windows窗体应用程序,并希望反序列化我从网址获取的JSON字符串,以便我可以从中获取两个值,我将如何进行此操作?
下面是我获取JSON字符串的代码,如果你转到它获得的URL,你也可以看到JSON字符串。我想获得项目名称和当前价格。您可以在当前密钥下看到价格。
private void GrabPrices()
{
using (WebClient webClient = new System.Net.WebClient())
{
WebClient n = new WebClient();
var json = n.DownloadString("http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=1513");
string valueOriginal = Convert.ToString(json);
Console.WriteLine(json);
}
}
它也将在SQLite数据库中进行迭代,并根据项目ID获取多个项目的相同数据,我将能够自己完成。
编辑我想尽可能使用JSON.Net,我一直在尝试使用它,看起来很容易,但我仍然遇到麻烦。
答案 0 :(得分:0)
好的,首先你需要知道你的JSON结构,样本:
[{
name: "Micheal",
age: 20
},
{
name: "Bob",
age: 24
}]
使用此信息,您可以派生出一个C#对象
public class Person
{
public string Name {get;set;}
public int Age {get;set;}
}
现在,您可以使用JSON.NET将JSON反序列化为C#:
var people = JsonConvert.DeserializeObject<List<Person>>(jsonString);
如果您查看原始JSON,它是一个对象数组,为了解决这个问题,我使用了List<T>
。
要记住的关键事项,您需要在JSON对象的属性中使用C#对象镜像。如果您没有列表,那么您就不需要List<T>
。
如果您的JSON对象具有驼峰套管,并且您希望将其转换为C#约定,那么请使用:
var people = JsonConvert.DeserializeObject<List<Person>>(
jsonString,
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
答案 1 :(得分:0)
首先,您需要为JSON
创建一个类结构public class Wrapper
{
public Item item;
}
public class Item
{
public string icon { get; set; }
public string icon_large { get; set; }
public int id { get; set; }
public string type { get; set; }
public string typeIcon { get; set; }
public string name { get; set; }
public string description { get; set; }
public GrandExchange current { get; set; }
public GrandExchange today { get; set; }
public bool members { get; set; }
public GrandExchange day30 { get; set; }
public GrandExchange day90 { get; set; }
public GrandExchange day180 { get; set; }
}
public class GrandExchange
{
public string trend { get; set; }
public string price { get; set; }
}
然后,您需要将当前项序列化为Wrapper
类
var wrapper = JsonConvert.DeserializeObject<Wrapper>(json);
然后,如果您想要列表中的多个项目,可以使用以下代码:
// Items to find
int[] itemIds = {1513, 1514, 1515, 1516, 1517};
// Create blank list
List<Item> items = new List<Item>();
foreach (int id in itemIds)
{
var n = new WebClient();
// Get JSON
var json = n.DownloadString(String.Format("http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item={0}", id));
// Parse to Item object
var wrapper = JsonConvert.DeserializeObject<Wrapper>(json);
// Append to list
items.Add(wrapper.item);
}
// Do something with list
值得注意的是,Jagex限制在一个时间范围内从某个IP调用此API的次数,超过该限制将阻止您的IP一段时间。 (将尝试为此找到参考)