C# 将JSON字符串反序列化为C中dropdownlist的列表#
我有一个windows窗体应用程序,希望反序列化从web地址获取的JSON字符串,以便从中仅获取两个值,我将如何执行此操作 下面是我必须获取JSON字符串的代码,如果您转到它获取的URL,您也可以看到JSON字符串。我只想知道商品名称和当前价格。您可以看到当前键下的价格C# 将JSON字符串反序列化为C中dropdownlist的列表#,c#,json,C#,Json,我有一个windows窗体应用程序,希望反序列化从web地址获取的JSON字符串,以便从中仅获取两个值,我将如何执行此操作 下面是我必须获取JSON字符串的代码,如果您转到它获取的URL,您也可以看到JSON字符串。我只想知道商品名称和当前价格。您可以看到当前键下的价格 private void GrabPrices() { using (WebClient webClient = new System.Net.WebClient()) {
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,我一直在尝试使用它,看起来很简单,但我仍然有问题。好的,首先你需要知道你的JSON结构,示例:
[{
name: "Micheal",
age: 20
},
{
name: "Bob",
age: 24
}]
利用这些信息,您可以派生C#对象
现在,您可以使用JSON.NET将JSON反序列化为C#:
var people=JsonConvert.DeserializeObject(jsonString);
如果您查看原始JSON,它是一个对象数组,为了处理这个问题,我使用了List
要记住的关键点是,您需要在JSON对象的属性中包含C#对象镜像。如果没有列表,则不需要list
如果您的JSON对象具有驼峰式大小写,并且希望将其转换为C#约定,那么请使用以下命令:
var people = JsonConvert.DeserializeObject<List<Person>>(
jsonString,
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
var people=JsonConvert.DeserializeObject(
jsonString,
新JsonSerializerSettings{ContractResolver=new CamelCasePropertyNamesContractResolver()});
首先,您需要为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; }
}
然后,需要将当前项序列化为包装器类
var wrapper = JsonConvert.DeserializeObject<Wrapper>(json);
var wrapper=JsonConvert.DeserializeObject(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
//要查找的项目
int[]itemIds={1513、1514、1515、1516、1517};
//创建空白列表
列表项=新列表();
foreach(itemIds中的int-id)
{
var n=新的WebClient();
//获取JSON
var json=n.DownloadString(String.Format(“http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item={0},id));
//解析项对象
var wrapper=JsonConvert.DeserializeObject(json);
//附加到列表
items.Add(wrapper.item);
}
//用列表做些什么
还值得注意的是,Jagex限制了在一个时间范围内从某个IP调用此API的次数,超过该限制将在一段时间内阻止您的IP。(将尝试为此查找引用)JSON不会返回数组/多个项,因此您无法从中创建列表。@Nunners这不是100%正确。他可以将返回的字符串拆分成一个特定的字符来填充一个列表。到目前为止,我很喜欢这种情况,并且想知道是否有办法将数据添加到下拉列表中,并在每次加载应用程序时动态更新价格。(我正在制作的应用程序是一个drop logger,我想计算整个行程的价格)@lucky4您是否使用Windows窗体/ASP.NET?代码更新数据库将超出此问题的范围,但您将在current.price
属性中拥有数据。还要看看数据库的使用,因为您将使用这个更复杂的类结构,如果您使用实体框架(代码优先),您将永远不需要手动更正SQL语句。我使用的是Windows窗体。@unlucky4是否希望在应用程序加载时获得价格?或者当选择每个项目时?项目是否存储在数据库中?如何建立供选择的项目列表?
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