У меня есть таблица данных, как показано ниже, которая содержит несколько столбцов. Один из столбцов данных имеет значение как массив json (Контакты). Я хочу получить доступ к свойству name из столбца.
Name ID Contacts
User1 1 [{ "id": 1, "name": "User3", } }]]
Какую базу данных вы используете? SQL Server 2016+ и PostgreSQL имеют функции JSON, что означает, что вы можете просто извлекать имена контактов вместо всего объекта. В противном случае вам придется десериализовать строку JSON и прочитать значение name.
Его данные с json (преобразованы в строку).
@PanagiotisKanavos, это неправда. Postgresql имеет массивы, но только простые одномерные.
@daremachine, что не так? Что Postgres поддерживает JSON? Эти данные выглядят как JSON? Действительно ли нам нужно начинать обсуждение SQL, языка и настроек, вводимых каждым поставщиком, и насколько легко или сложно индексировать и запрашивать многозначные поля, даже если они доступны? Таким образом, сделать многозначные столбцы проблематичными, даже если они доступны?
@PanagiotisKanavos @daremachine Этот вопрос (насколько я могу судить) не имеет ничего общего с базой данных. OP использует элемент управления пользовательского интерфейса Datatable
@MindSwipe Datatable не является элементом управления пользовательского интерфейса. Это класс, используемый для доступ к данным. Он редко используется вне этого сценария. Извлечение атрибута name с использованием функций базы данных может быть Полегче или Быстрее, чем в клиенте.
@PanagiotisKanavos моя ошибка, я лишь немного знаком с Datatable в JSF, где он используется для динамического рендеринга таблиц Html.
@PanagiotisKanavos "Сериализатор JSON для чтения содержимого" - вот в чем собственно вопрос. можете ли вы предоставить образец кода, если это возможно?
@PanagiotisKanavos Я поставил лайк вам, но мой комментарий был к вашему первому предложению. С остальными все в порядке, и я согласен с этим.





Эта таблица содержит строку 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
nameno matter where it is in the hierarchy (..)
Столбцы базы данных не содержат массивов. Скорее всего, вы имеете в виду, что
Contactsсодержит строку JSON. Используйте JSON.NET или другой сериализатор JSON для чтения содержимого.