У меня есть следующий массив:
{
"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"]
Есть ли лучшие способы?
Это С#, я правильно угадал?
Какую библиотеку вы используете для работы с json? Это Json.NET? Добавьте тег, пожалуйста.
@AlexanderPetrov помечен как c#, так что я так думаю?
Возможна ли десериализация в сильный тип, например 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")
?
@DevlinPaddock - я добавил этот тег.
@AlexanderPetrov Ах, как плохо, я не знал, что вы можете добавлять такие теги. Я буду иметь это в виду в будущем
спасибо за комментарии, @xdtTransform, это был бы один метод, но мне было интересно, есть ли другой метод без создания сильного типа.
@sajid, на данный момент я использую (string)t["customizedData"][2]["value"] при этом работает, но мне было интересно, могу ли я выполнить поиск ключа: SubscriptionName вместо прямого доступа к свойству через индекс массива
Предполагая, что вы используете Json.net, чтобы вы могли использовать t.SelectToken("$.customizedData[?(@.key == 'SubscriptionName')]").SelectToken("value").ToString()
@Stanza Как насчет проблемы? Решает ли какой-либо из приведенных ниже ответов ваш вопрос? Если да, вы можете принять его как ответ, чтобы он мог помочь другим членам сообщества, у которых возникают те же проблемы, и мы могли бы заархивировать эту тему, спасибо.
Предположим, вы используете 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. Лучше разобрать один раз и потом извлекать, извлекать, извлекать.
Можете ли вы поделиться тем, что вы пробовали до сих пор?