Можно ли десериализовать строку 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 3

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": "Закрыто"}