Я хочу без особых хлопот преобразовать то, что в конечном счете является словарем JSON, в словарь C#.
Может, я ошибаюсь, используя здесь библиотеку JSON.NET? Класс JArray не хочет давать мне ничего для доступа к атрибуту (только значение), т.е. он сообщает мне значение, но никогда не "ключ".
Я не могу поверить, что никто другой не найдет это ограничение, поэтому предполагаю, что я что-то упускаю. Моя запутанная попытка такова:
Учитывая этот json:
{
"appSettings" : [
{"rows": "5"},
{"columns" : "7"}
]
}
Я хотел бы выбрать это в словарь следующим образом:
var dict = jsonObject["appSettings"].Select(s => new
{
key = s.Name, // wish this property existed
value = s.Value // wish this property existed
}).ToDictionary(s => s.key, s => s.value);
Это мой UnitTest:
[Test]
public void CanLoadJsonAppSettings()
{
var json = @"
""{appSettings"" : [
{""ViewRows"" : ""1""},
{""ViewColumns"" : ""2""}
]}";
var dict = CreateJsonDictionary(json);
Assert.That(dict.Count, Is.EqualTo(2));
}
public CreateJsonDictionary(string jsonText)
{
var jsonObject = JObject.Parse(jsonText);
return jsonObject["appSettings"].Select(s => new
{
key = s.Name,
value = s.Value
}).ToDictionary(s => s.key, s => s.value);
}
EDIT: благодаря @jim мы стали немного ближе. Для полноты я задокументирую немного неловкий шаг, который мне потребовался, чтобы добраться до нужного мне объекта:
Мне пришлось изменить свой JSON. Вместо использования массива (как в приведенном выше коде) я использовал более простой/настоящий словарь:
var json = @"
{
""appSettings"" : {
""ViewRows"" : ""1"",
""ViewColumns"" : ""2""
}
}";
Затем мне пришлось разобрать, получить JSON JObject, затем преобразовать обратно в строку, а затем десериализовать:
var jo = JObject.Parse(jsonText);
var appSettings = jo["appSettings"];
var appSettings = JsonConvert.DeserializeObject<Dictionary<string, string>>(appSettings.ToString());
Так что часть моей проблемы заключалась в том, чтобы запутать JSON. Тем не менее, если есть более элегантный способ сделать это, я весь внимание.
EDIT2: мне все еще нужно было решить исходную проблему, описанную выше, преобразовав массив JSON в словарь. Как только мой JSON будет исправлен, чтобы содержать правильные пары имя/значение:
"connectionStrings": [
{"name" : "string1", "value" : "value1"},
{"name" : "string2", "value" :"value2"},
]
Это код, который решил эту проблему (но это очень похоже на мою первоначальную попытку):
var jsonObj = JObject.Parse(jsonText);
var conStrings = jsonObj.Properties().Select(s =>
new {
key = s.Name,
value = s.Value.ToString()
}).ToDictionary(s => s.key, s => s.value);
И это работает, только если у вас нет других массивов.