Как десерализовать объект json в запросе linq? - PullRequest
0 голосов
/ 15 февраля 2019

Я извлекаю данные 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 ]

0 голосов
/ 15 февраля 2019

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

        public static void something()
        {
            File.ReadLines(filePath)
                .AsParallel()
                .Select(x => x.TrimStart('[').TrimEnd(']'))
                .Select(JsonConvert.DeserializeObject<LiveAMData>)
                .ForAll(WriteRecord);
        }
0 голосов
/ 15 февраля 2019

Вы пытаетесь десериализовать массив 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>>

...