У меня есть строка Json из API Visistat.com, которую я пытаюсь разобрать на С# с Json.Net. Строка Json выглядит так:
[
["date", "uniques"],
["2014-04-15", "613"],
["2014-04-16", "631"],
["2014-04-17", "593"],
["2014-04-18", "466"],
["2014-04-19", "305"],
["2014-04-20", "294"],
["2014-04-21", "795"],
["2014-04-22", "666"],
["2014-04-23", "625"],
["2014-04-24", "571"],
["2014-04-25", "506"],
["2014-04-26", "342"],
["2014-04-27", "351"],
["2014-04-28", "720"],
["2014-04-29", "606"],
["2014-04-30", "588"],
["2014-05-01", "508"],
["2014-05-02", "545"],
["2014-05-03", "345"],
["2014-05-04", "379"],
["2014-05-05", "833"],
["2014-05-06", "635"],
["2014-05-07", "596"],
["2014-05-08", "530"],
["2014-05-09", "539"],
["2014-05-10", "322"],
["2014-05-11", "290"],
["2014-05-12", "734"],
["2014-05-13", "684"],
["2014-05-14", "555"],
["2014-05-15", "511"]
]
Я создал объект для десериализации этого в:
public class DateUnique
{
public DateTime date { get; set; }
public int uniques { get; set; }
}
Затем я пытаюсь проанализировать строку Json:
List<DateUnique> dateuniques = JsonConvert.DeserializeObject<List<DateUnique>>(json);
Затем я получаю это исключение:
Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип "VisiStatSystem.DateUnique", потому что для десериализации корректно требуется тип JSON (например, {"name": "value"}). Чтобы исправить эту ошибку, измените JSON на объект JSON (например, {"name": "value"}) или измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), например List, который может десериализоваться из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON. Путь '[0]', строка 1, позиция 2.
Я не вижу никаких образцов в документации Json.net, которая показывает, как десериализовать строку Json, которая похожа на то, что возвращается VisiStat Api. Любая помощь ценится!
Вы получаете эту ошибку, потому что ваш JSON - это массив массивов, а не массив объектов, в то время как вы пытаетесь разобрать его так, как если бы он был последним. Для десериализации его в List<DateUnique>
вам понадобится немного специальной обработки.
Следующий код должен работать:
JArray array = JArray.Parse(json);
List<DateUnique> list = new List<DateUnique>(array.Count - 1);
for (int i = 1; i < array.Count; i++)
{
list.Add(new DateUnique
{
date = DateTime.ParseExact(array[i][0].ToString(),
"yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture),
uniques = int.Parse(array[i][1].ToString())
});
}