C# 将JSON字符串反序列化为C中dropdownlist的列表#

C# 将JSON字符串反序列化为C中dropdownlist的列表#,c#,json,C#,Json,我有一个windows窗体应用程序,希望反序列化从web地址获取的JSON字符串,以便从中仅获取两个值,我将如何执行此操作 下面是我必须获取JSON字符串的代码,如果您转到它获取的URL,您也可以看到JSON字符串。我只想知道商品名称和当前价格。您可以看到当前键下的价格 private void GrabPrices() { using (WebClient webClient = new System.Net.WebClient()) {

我有一个windows窗体应用程序,希望反序列化从web地址获取的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,我一直在尝试使用它,看起来很简单,但我仍然有问题。

好的,首先你需要知道你的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