доступ к массиву из столбца данных в c # - PullRequest
0 голосов
/ 15 октября 2018

У меня есть дата, как показано ниже, которая содержит несколько столбцов.Один из столбцов данных имеет значение в виде массива json (Контакты).Я хочу получить доступ к свойству name из столбца.

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

1 Ответ

0 голосов
/ 15 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...