Эта таблица содержит строку 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
или 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
независимо от того, где он находится в иерархии (..
)