[英]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.Parse
或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
属性..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.