c# - 从 C# 中的数据表列访问数组
问题描述
我有一个如下所示的数据表,其中包含几列。数据表列之一的值为 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
将返回第一个元素的名称属性。
在这种情况下,最好创建一个具体类型而不是使用动态:
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
or解析它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
无论它在层次结构中的什么位置 (..
)
推荐阅读
- php - 如何从 MySQL 数据库中检索单行并仅显示包含大于零的值的列
- c++ - TCP sockets (client-server) recv() returning -1 value
- swift - 如何在 macOS / swift 的 AVAudioEngine 中选择音频输入设备(麦克风)?
- java - 为 minecraft 1.12 modding 设置编程环境,遇到 gradle 反编译错误
- c++ - 为什么这个帕斯卡三角实现给我尾随零?
- sql - SQL - 将两列与其中一列的日期范围相加
- python - 如何在 Pandas 的查询中使用带有引号和空格的变量(字符串)?
- r - Fast reading of numerical matrices from file in R
- reactjs - Provider 实例之间是否共享从 React 中的相同上下文派生的上下文值?
- python - 试图选择 id 的 div 标签在 scrapy 中不起作用