首页 > 解决方案 > 从 C# 中的数据表列访问数组

问题描述

我有一个如下所示的数据表,其中包含几列。数据表列之一的值为 json 数组 ( Contacts )。我想name从列中访问属性。

Name     ID    Contacts 
User1    1     [{ "id": 1, "name": "User3", } }]]

标签: c#arraysjsondatatable

解决方案


此表包含 JSON 字符串,而不是数组。要获取该字段的内容,必须使用JSON.NET对其进行反序列化并读取其内容,例如:

var contactValue=(string)table.Rows[0]["Contacts"];            
var contacts=JsonConvert.DeserializeObject<dynamic>(contactValue);
Console.WriteLine("{0}",contacts[0].name);

JsonConvert.DeserializeObject可以将 JSON 字符串反序列化为具体类型或动态对象。在此示例中,内容被反序列化为包含数组的动态对象。contacts[0].name将返回第一个元素的名称属性。

在这种情况下,最好创建一个具体类型而不是使用动态:

class Contact 
{
        public int id {get;set;}
        public string name{get;set;}
}

这允许使用 LINQ 来检索特定属性,例如:

var  contacts=JsonConvert.DeserializeObject<Contact[]>(contactValue);

//Iterate over the results
foreach(var contact in contacts)
{
    Console.WriteLine(contact.name);
}
//Or use LINQ
var names=contacts.Select(it=>it.name).ToList();

使用 JSONPath

另一种选择是使用JSONPath提取特定值而不解析整个字符串。

不是反序列化字符串,而是使用JArray.Parseor解析它JObject.Parse。之后,SelectTokens用于检索与查询路径匹配的值:

var array=JArray.Parse(contactValue);
var tokens=array.SelectTokens("$..name");
foreach(var token in tokens)
{
    Console.WriteLine(token);
}
//Concatenate all names into a string
string allNames=String.Join(",",tokens);

$..name方法

对于任何元素,返回任何命名的属性,name无论它在层次结构中的什么位置 ( ..)


推荐阅读