C#如何使用Newtonsoft反序列化我的json文件?

时间:2016-10-17 23:40:39

标签: c# json json.net

好的,所以我看了一遍,找不到如何做到这一点的答案。

这是我的json文件

    {
        "item": {
            "icon": "icon.png",
            "icon_large": "icon_large.png",
            "id": 453,
            "type": "misc",
            "typeIcon": "icontype.png",
            "name": "Item name",
            "description": "item description",
            "current": {
                "trend": "neutral",
                "price": 174
            },
            "today": {
                "trend": "positive",
                "price": "+2"
            },
            "premium": "false"
            }
    }

我尝试过这个类作为反序列化的方法(我只需要“当前”树中的项目名称和价格)

    public class MyItem
    {
        public Dictionary<string, Item> item;     
    }
    public class Item
    {
        public string name;
        public Dictionary<string, Current> current;
    }
    public class Current
    {
        public string price;
    }

这是从我的主要课程中调用的

    private void buttonAddItemToWatcher_Click(object sender, EventArgs e)
    {
        string url = "link to json above;         
        string json = new WebClient().DownloadString(url);

        MyItem newItem = new MyItem();

        JsonConvert.PopulateObject(json, newItem);

    }

但我收到此错误

  

Newtonsoft.Json.dll中出现了“Newtonsoft.Json.JsonSerializationException”&gt;类型的未处理异常

     

其他信息:将值&gt;“icon.png”转换为“RS_GrandExchangeWatcher.Item”时出错。路径'item.icon',第1行,第95位。

我不太了解如何设置我的类以便用我提供的json填充我的MyItem类

2 个答案:

答案 0 :(得分:2)

您的C#类与您的JSON不匹配。

复制您的JSON,转到Visual Studio 2015,打开.cs文件,在菜单编辑 - &gt; 选择性粘贴 - &gt; 将JSON粘贴为类

How to paste as JSON

你得到相应的C#类:

public class MyItem
{
    public Item item { get; set; }
}

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 Current current { get; set; }
    public Today today { get; set; }
    public string premium { get; set; }
}

public class Current
{
    public string trend { get; set; }
    public int price { get; set; }
}

public class Today
{
    public string trend { get; set; }
    public string price { get; set; }
}

答案 1 :(得分:0)

您的架构与JSON

不符

成为MyItem您的根对象,它表示它的属性"item"的值为Dictionary<string, Item>,但您的Item类有name仅限于current属性,而在JSON中有"icon"等其他几个属性。

您可以尝试将所有内容解析为Dictionary<string, dynamic>,迭代并仅将current属性值解析为Current