如何在linq查询中反序列化json对象?

时间:2019-02-15 08:02:01

标签: c# json linq filestream jsonconvert

我正在linq中从txt文件中获取json数据,并对此执行一些操作以加快处理速度。但是当我尝试调用该查询时,它向我显示了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 :(得分:3)

您正在尝试反序列化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>>

答案 1 :(得分:0)

在逐个反序列化每个对象时,不需要在List类型中输入 DeserializeObject个电话。试试这个:

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