Я хочу преобразовать словарь в 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);
}
РЕДАКТИРОВАТЬ : Благодаря @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);
И это работает, только если у вас нет других массивов.