Доступ к массиву из столбца данных в C#

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

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

Столбцы базы данных не содержат массивов. Скорее всего, вы имеете в виду, что Contacts содержит строку JSON. Используйте JSON.NET или другой сериализатор JSON для чтения содержимого.

Panagiotis Kanavos 15.10.2018 09:25

Какую базу данных вы используете? SQL Server 2016+ и PostgreSQL имеют функции JSON, что означает, что вы можете просто извлекать имена контактов вместо всего объекта. В противном случае вам придется десериализовать строку JSON и прочитать значение name.

Panagiotis Kanavos 15.10.2018 09:26

Его данные с json (преобразованы в строку).

EverythingEthical 15.10.2018 09:44

@PanagiotisKanavos, это неправда. Postgresql имеет массивы, но только простые одномерные.

daremachine 15.10.2018 09:48

@daremachine, что не так? Что Postgres поддерживает JSON? Эти данные выглядят как JSON? Действительно ли нам нужно начинать обсуждение SQL, языка и настроек, вводимых каждым поставщиком, и насколько легко или сложно индексировать и запрашивать многозначные поля, даже если они доступны? Таким образом, сделать многозначные столбцы проблематичными, даже если они доступны?

Panagiotis Kanavos 15.10.2018 09:52

@PanagiotisKanavos @daremachine Этот вопрос (насколько я могу судить) не имеет ничего общего с базой данных. OP использует элемент управления пользовательского интерфейса Datatable

MindSwipe 15.10.2018 09:52

@MindSwipe Datatable не является элементом управления пользовательского интерфейса. Это класс, используемый для доступ к данным. Он редко используется вне этого сценария. Извлечение атрибута name с использованием функций базы данных может быть Полегче или Быстрее, чем в клиенте.

Panagiotis Kanavos 15.10.2018 09:54

@PanagiotisKanavos моя ошибка, я лишь немного знаком с Datatable в JSF, где он используется для динамического рендеринга таблиц Html.

MindSwipe 15.10.2018 09:57

@PanagiotisKanavos "Сериализатор JSON для чтения содержимого" - вот в чем собственно вопрос. можете ли вы предоставить образец кода, если это возможно?

EverythingEthical 15.10.2018 10:02

@PanagiotisKanavos Я поставил лайк вам, но мой комментарий был к вашему первому предложению. С остальными все в порядке, и я согласен с этим.

daremachine 15.10.2018 10:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта таблица содержит строку 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 означает

For any element, return any attribute named name no matter where it is in the hierarchy (..)

Другие вопросы по теме