繁体   English   中英

从C#中的datatable列访问数组

[英]accessing array from datatable column in c#

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

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

该表包含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将返回第一个元素的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.ParseJObject.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属性..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM