Можно ли десериализовать строку JSON в массив C#?
Я пытаюсь десериализовать строку JSON
[{ "key" : "1", "value" : "open"}, {"key" : "2", "value" : "closed"}, {"key" : "3", "value" : "pending"}]
В массив C#. Я получаю ошибку "нет конструктора без параметров, определенного для типа' System.Массив'."Я извлекаю JSON из базы данных, затем я хотел десериализовать его, чтобы я мог получить доступ к значениям и обновить другое поле в моей базе данных с тем, что пользователь передал. Это просто пример, который я пытаюсь, хотя и мне нужно, чтобы он был динамическим, а не статическим, так как строка JSON, содержащаяся в базе данных, может быть переменная.
Я пытался использовать словарь ранее, но не имел успеха с этим. Поэтому я сейчас пытаюсь использовать другой подход, десериализуя его в массив, тогда я собирался заполнить словарь из массива.
Это метод, который я пытаюсь реализовать в данный момент...хотя я пробовал и несколько других...
IList<Array> ValueArray = new JavaScriptSerializer().Deserialize<IList<Array>>(this.Parameter.ValueList);
//this.Parameter.ValueList just contains my JSON string
Я думаю, что не могу сделать этого, не создав свой собственный класс?
Когда я попытался использовать словарь, я попробовал это
Dictionary<string, string> ValueList =
JsonConvert.DeserializeObject<Dictionary<string, string>>(this.Parameter.ValueList);
Но получил эта ошибка
" не удается десериализовать текущий массив JSON (например, [1,2,3]) В тип - Система.Коллекции.Родовой.Словарь`2 [Система.Струна, Система.Строка]' потому что для этого типа требуется объект JSON (например, {"name": "value"}), чтобы десериализуйте правильно. Чтобы исправить эту ошибку, либо измените JSON на a Объект JSON (например, {"name": "value"}) или измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например ICollection, IList) как список, который может быть десериализовать из JSON массив. JsonArrayAttribute также можно добавить к типу, чтобы принудить его к десериализация из массива JSON. Путь", строка 1, Позиция 1."
Поэтому я начал использовать массив вместо этого.
3 ответа:
var list = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json); public class KeyValue { public string key; public string value; }
Или просто использовать
KeyValue
временноvar dict = new JavaScriptSerializer().Deserialize<List<KeyValue>>(json) .ToDictionary(x => x.key, x => x.value);
Если вы открыты для использования Json.Net , вы можете непосредственно преобразовать его в Словарь
var dict = JsonConvert.DeserializeObject<JArray>(json) .ToDictionary(x => (string)x["key"], x => (string)x["value"]);
Попробуйте
Но я не уверен, поддерживается ли она этой библиотекой.List<Dictionary<string, string>> ValueList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(this.Parameter.ValueList);
Я только что это понял. Существует определенный синтаксис, который вы должны использовать для словаря. Первое, что я проверил при первой попытке решить эту проблему, была моя строка JSON (я использовал JSONLint.com), и это действительно так, что сбило меня со следа жука...
Но я просто сделал еще немного тестов с ним, взяв словарь и сериализовав его, чтобы увидеть, как выглядит JSON like...So синтаксис моего JSON для преобразования в словарь должен быть следующим
{"1":"В Ожидании", "2": "Открыто", "3": "Закрыто"}