Как десерализовать объект json в запросе linq?

Я извлекаю данные json из txt файла в linq и выполняю некоторые действия, чтобы ускорить процесс. но когда я пытаюсь вызвать этот запрос, он показывает ошибку для десериализации объекта json. Так как его десериализовать?

Я получаю ошибку как

Невозможно десериализовать текущий объект JSON (например, {"name":"value"}) в тип 'System.Collections.Generic.List1[MMF.LiveAMData]', поскольку для типа требуется массив JSON (например, [1,2,3]) правильно десериализовать.

Я ищу, чтобы решить эту проблему, но почти все ответы выполняют десериализацию без linq. Мне нужно использовать linq из-за задержки времени.

Ниже мой метод, который я называю

public static void something()
      {
          File.ReadLines(filePath)
              .AsParallel()
              .Select(x => x.TrimStart('[').TrimEnd(']'))
              .Select(JsonConvert.DeserializeObject<List<LiveAMData>>)
              .ForAll(WriteRecord);
      }

и ниже мой объект класса, который я использую

public class LiveAMData
    {
        public string ev { get; set; }
        public string sym { get; set; }
    }

2 ответа

Решение

Вы пытаетесь десериализовать массив JSON, но вы обрезаете [ а также ] части, так что это больше не массив JSON. Удалить линию обрезки:

public static void something()
{
    File.ReadLines(filePath)
        .AsParallel()
        .Select(JsonConvert.DeserializeObject<List<LiveAMData>>)
        .ForAll(WriteRecord);
}

Если каждая строка вашего файла представляет собой массив JSON, например:

[{"ev":"Test1", "sym": "test"},{"ev":"Test2", "sym": "test"}]

Ваша линия обрезки изменит это на этот недопустимый JSON:

{"ev":"Test1", "sym": "test"},{"ev":"Test2", "sym": "test"}

Который, безусловно, не может быть десериализован в List<LiveAMData>>

Поскольку вы десериализуете каждый объект индивидуально, вам не нужно List введите в DeserializeObject вызов. Попробуй это:

        public static void something()
        {
            File.ReadLines(filePath)
                .AsParallel()
                .Select(x => x.TrimStart('[').TrimEnd(']'))
                .Select(JsonConvert.DeserializeObject<LiveAMData>)
                .ForAll(WriteRecord);
        }
Другие вопросы по тегам