如何访问JSON对象列表

时间:2015-02-18 14:56:43

标签: c# arrays json json.net

我正在努力获得"名称"和"价值"我从外部加载的JSON文件中的属性。

我尝试访问Valuestore列表,但返回时出现错误。

"""无法将当前JSON对象(例如{" name":" value"})反序列化为类型'系统.Collections.Generic.List`1 [ExternalJSON.Form1 + Valuestore]'因为类型需要JSON数组""""

如何访问列表值存储并在列表视图中打印名称和值。

我的代码

    public class Value
    {
        public string value { get; set; }
    }

    public class Valuestore
    {
        public string name { get; set; }
        public string type { get; set; }
        public Value value { get; set; }
    }

    public class RootObject
    {
        public string version { get; set; }
        public List<Valuestore> Valuestore { get; set; }
    }

    private void button1_Click(object sender, EventArgs e)
    {

        var json = File.ReadAllText(".....\\static_settings");

        var settingsNamelst1 = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(json);
        var settingsNamelst2 = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Valuestore>>(json);

        foreach (var lst in settingsNamelst2)
        {
            listView1.Items.Add(lst.name);
        }

    }

我的JSON文件是

{
    "version": "2",
    "valuestore": [
        {
            "name": "abcd1",
            "type": "string",
            "value": {
                "value": "0002"
            }
        },
        {
            "name": "abcd2",
            "type": "string",
            "value": {
                "value": "001"
            }
        }
    ]
}

2 个答案:

答案 0 :(得分:2)

您可以做的最简单的事情是动态反序列化,并通过动态属性访问对象。

var json = @"{
                        ""version"": ""2"",
                        ""valuestore"": [
                            {
                                ""name"": ""abcd1"",
                                ""type"": ""string"",
                                ""value"": {
                                    ""value"": ""0002""
                                }
                            },
                            {
                                ""name"": ""abcd2"",
                                ""type"": ""string"",
                                ""value"": {
                                    ""value"": ""001""
                                }
                            }
                        ]
                    }";

        dynamic jsonTemp = JsonConvert.DeserializeObject(json);
        foreach (var i in jsonTemp.valuestore)
        {
            Console.WriteLine("name: {0}, value: {1} \n", i.name, i.value.value);
        }

答案 1 :(得分:0)

您的settingsNamelst1属性已经反序列化并包含Valuestore,无需再次对其进行反序列化:

var settingsNamelst1 = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var item in settingsNamelst1.Valuestore)
{
    listView1.Items.Add(item.name);
}

您看到异常的原因是您的JSON架构与List<Valuestore>不匹配,它与您的RootObject匹配。