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

时间:2014-11-07 07:54:09

标签: c# json

我有一个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,我一直在尝试使用它,看起来很容易,但我仍然遇到麻烦。

2 个答案:

答案 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一段时间。 (将尝试为此找到参考)