从json数组读取特定数据

时间:2019-10-21 08:36:40

标签: c# arrays json json-deserialization

我有这样的json表,如何尝试特定数据?

var json_str={ "table1":[
{"name1":"data1"},
{"name2":"data2"},
{"name3":"data3"}
],
"table2":[
{"name1":"data1"},
{"name2":"data2"},
{"name3":"data3"}
]
}   
dynamic stuff = JsonConvert.DeserializeObject(json_string); 

//I'd like attempt to data like this(for example)

var abc=stuff.table1["name1"];

这显然是错误的,但是有什么方法可以通过名称来调用json表的内容吗?

已解决: 我将json更改为

var json_str={ "table1":{
"name1":"data1",
"name2":"data2",
"name3":"data3"
},
"table2":{
"name1":"data1",
"name2":"data2",
"name3":"data3"
}
} 

var abc=JsonConvert.DeserializeObject<Form1.RootObject>(json_str);  

,现在我尝试通过以下方式进行尝试: abc.table1.name2;

非常感谢xdtTransform和所有人的提示。

3 个答案:

答案 0 :(得分:0)

只需使用点符号即可。

工作示例:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        var json_str = "{ \"table1\":[{\"name1\":\"data1\"},{\"name2\":\"data2\"},{\"name3\":\"data3\"}],\"table2\":[{\"name1\":\"data1\"},{\"name2\":\"data2\"},{\"name3\":\"data3\"}]}";
        dynamic stuff = JsonConvert.DeserializeObject(json_str);

        Console.WriteLine(stuff.table2[0].name1); // prints "data1"

    }
}

替代:

stuff["table2"][0]["name1"]

您的为什么不工作:

var abc=stuff.table1["name1"];

您不能直接访问“ name1”,因为它在对象数组内部。以[0]作为第一个元素,之后可以访问name1。

答案 1 :(得分:0)

为什么不将您的Json反序列化为强类型对象,如以下示例所示

 class Program
    {
        static void Main(string[] args)
        {
            var json_str = "{ table1:[{name:'data1'}," +
                "{name:'data2'},{name:'data3'}]," +
                "table2:[{name:'data1'},{name:'data2'},{name:'data3'}]}";

            var collection = JsonConvert.DeserializeObject<TableCollectionObject>(json_str);

            foreach (var item in collection.table1)
            {
                Console.WriteLine(item.name);
            }

            foreach (var item in collection.table2)
            {
                Console.WriteLine(item.name);
            }

            Console.ReadLine();

        }
    }

    class TableCollectionObject
    {
        public ICollection<SingleTableObject> table1 { get; set; }
        public ICollection<SingleTableObject> table2 { get; set; }
    }

    class SingleTableObject
    {
        public string name { get; set; }
    }

请注意,我已将您的Json更改为可以由Newtonsoft.Json库解析的有效json对象。

答案 2 :(得分:0)

A。 JObject.Parse

JObject o = JObject.Parse(json);

var name = o["table1"][0]["name1"].Value<string>();// data1
var name2 = o["table2"][2]["name3"].Value<string>();// data3

B。 DicstionaryListDictionary

var d = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string,List<Dictionary<string,string>>>>(json);

var nameB = d["table1"][0]["name1"]; // data1
var nameB2 = d["table2"][2]["name3"]; // data3

这是我使用的测试数据。

var json = @"{ ""table1"":[
{""name1"":""data1""},
{""name2"":""data2""},
{""name3"":""data3""}
],
""table2"":[
{""name1"":""data1""},
{""name2"":""data2""},
{""name3"":""data3""}
]
}";

这是一种常见的数据结构,因为数组中的第一项具有一个称为name1的属性,而第二项具有一个名为name2的单一属性。

更常见的架构如下所示。

{
    "table1": [
        {
            "name1": "data1", "name2": "data2", "name3": "data3",
        },
        {
            "name1": "data1", "name2": "data2", "name3": "data3"
        }
    ]
}