Доступ к свойству из массива Json

У меня есть следующий массив:

{
   "customizedData":[
      {
         "key":"SubscriptionId",
         "value":"xxxxxxxxxxxxxxxx"
      },
      {
         "key":"OfferId",
         "value":"xxxxxxxxxxxxxx"
      },
      {
         "key":"SubscriptionName",
         "value":"DYNAMICS 365 BUSINESS CENTRAL TEAM MEMBER"
      },
      {
         "key":"Quantity",
         "value":"6"
      },
      {
         "key":"Status",
         "value":"Suspended"
      },
      {
         "key":"PartnerOnRecord",
         "value":"None"
      }
   ]
}

Как получить доступ к ключевым элементам:

"ключ": "Имя подписки",
"value": "ЧЛЕН КОМАНДЫ DYNAMICS 365 BUSINESS CENTRAL"

На данный момент я использую: (string)t["customizedData"][2]["value"]

Есть ли лучшие способы?

Можете ли вы поделиться тем, что вы пробовали до сих пор?

Mohammed Sajid 15.12.2020 12:30

Это С#, я правильно угадал?

Alexander Petrov 15.12.2020 13:48

Какую библиотеку вы используете для работы с json? Это Json.NET? Добавьте тег, пожалуйста.

Alexander Petrov 15.12.2020 13:49

@AlexanderPetrov помечен как c#, так что я так думаю?

Devlin Paddock 15.12.2020 15:07

Возможна ли десериализация в сильный тип, например public partial class KeyValueThing { [J("customizedData")] public List<CustomizedDatum> CustomizedData { get; set; } } public partial class CustomizedDatum { [J("key")] public string Key { get; set; } [J("value")] public string Value { get; set; } }, и простая фильтрация, например KeyValueThing.CustomizedData.FirstOrDefault(x=> x.Key= = "MyKey")?

xdtTransform 15.12.2020 16:01

@DevlinPaddock - я добавил этот тег.

Alexander Petrov 15.12.2020 16:03

@AlexanderPetrov Ах, как плохо, я не знал, что вы можете добавлять такие теги. Я буду иметь это в виду в будущем

Devlin Paddock 15.12.2020 16:29

спасибо за комментарии, @xdtTransform, это был бы один метод, но мне было интересно, есть ли другой метод без создания сильного типа.

Stanza 16.12.2020 00:46

@sajid, на данный момент я использую (string)t["customizedData"][2]["value"] при этом работает, но мне было интересно, могу ли я выполнить поиск ключа: SubscriptionName вместо прямого доступа к свойству через индекс массива

Stanza 16.12.2020 00:48

Предполагая, что вы используете Json.net, чтобы вы могли использовать t.SelectToken("$.customizedData[?(@.key == 'SubscriptionName')]").SelectToken("value").ToString()

Selim Yildiz 16.12.2020 09:03

@Stanza Как насчет проблемы? Решает ли какой-либо из приведенных ниже ответов ваш вопрос? Если да, вы можете принять его как ответ, чтобы он мог помочь другим членам сообщества, у которых возникают те же проблемы, и мы могли бы заархивировать эту тему, спасибо.

Alenros 22.12.2020 08:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
11
304
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Предположим, вы используете Json.net и не хотите создавать для него строгий тип, поэтому вы можете использовать SelectToken с JSONPath:

t.SelectToken("$.customizedData[?(@.key == 'SubscriptionName')].value").ToString();

Если вы используете Newtonsoft.Json nuget, это можно сделать с помощью вспомогательной функции. первое использование var jo = JObject.Parse(jsonContent); для анализа и передачи во вспомогательную функцию GetValueFromJson(jo, "SubscriptionName", "customizedData"), используя эту вспомогательную функцию:

    private string GetValueFromJson(JObject jo, string key, string rootKey)
    {
        var value = jo[rootKey].Children()
                                        .Where(i => i["key"].ToString() == key)
                                        .Select(i => i["value"].ToString())
                                        .FirstOrDefault();
        return value;
    }

Это неплохо, но я думаю, что было бы лучше передать JObject в качестве первого параметра. В противном случае, если вы хотите использовать метод несколько раз в одном и том же JSON для разных ключей, вы каждый раз будете повторно анализировать JSON. Лучше разобрать один раз и потом извлекать, извлекать, извлекать.

Brian Rogers 17.12.2020 23:52

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