До сих пор я использовал метод JsonConvert.Deserialize(json) в Json.NET, который работал довольно хорошо, и, честно говоря, мне не нужно ничего больше, чем это.
Я работаю над фоновым (консольным) приложением, которое постоянно загружает контент JSON с разных URL-адресов, а затем десериализует результат в список объектов .NET.
using (WebClient client = new WebClient())
{
string json = client.DownloadString(stringUrl);
var result = JsonConvert.DeserializeObject<List<Contact>>(json);
}
Простой фрагмент кода выше, вероятно, не кажется идеальным, но он делает свою работу. Когда файл большой (15 000 контактов - файл 48 МБ), JsonConvert.DeserializeObject не является решением, и в строке выдается тип исключения JsonReaderException.
Загруженный контент JSON представляет собой массив, и вот так выглядит пример. Contact - это контейнерный класс для десериализованного объекта JSON.
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]
Мое первоначальное предположение, что не хватает памяти. Просто из любопытства я попытался разобрать его как JArray, что также вызвало то же исключение.
Я начал погружаться в документацию Json.NET и читать похожие темы. Поскольку мне пока не удалось выработать рабочее решение, я решил разместить здесь вопрос.
ОБНОВЛЕНИЕ: при десериализации построчно, я получил ту же ошибку: "[. Path '', строка 600003, позиция 1." Поэтому скачали два из них и проверили их в Notepad++. Я заметил, что если длина массива больше 12000, после 12000-го элемента "[" закрывается и запускается другой массив. Другими словами, JSON выглядит именно так:
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]