C# 通过json.net从流中反序列化多个对象

C# 通过json.net从流中反序列化多个对象,c#,json,json.net,streamreader,C#,Json,Json.net,Streamreader,格雷廷斯!我需要反序列化序列化为json的不同对象的文件。以下是生成的文件: { "Number": 1, "Description": "Run version with strategy data", "Context": "NA" }[ { "N": 0.0, "T": 2.0, "Adc": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0

格雷廷斯!我需要反序列化序列化为json的不同对象的文件。以下是生成的文件:

{
  "Number": 1,
  "Description": "Run version with strategy data",
  "Context": "NA"
}[
  {
    "N": 0.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.0,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 1.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.2999999523162842,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 2.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.0,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 3.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.2999999523162842,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 4.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.0,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 5.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.2999999523162842,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 6.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.0,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 7.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.2999999523162842,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 8.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.0,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  },
  {
    "N": 9.0,
    "T": 2.0,
    "Adc": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "SpltFr": 2.2999999523162842,
    "Acc": 1.0,
    "DAcc": 0.0,
    "Acc2": 1.0,
    "OscFr": 0.5,
    "Fltr": 0,
    "CmpEr": false,
    "ErrPck": 0,
    "IndxDiff": 0,
    "Pos": 0,
    "FastAcc": [],
    "GIndx": 0,
    "Indx": 0,
    "PcTime": "0001-01-01T00:00:00"
  }
]
我使用的是json.net,但它似乎并不像我希望的那样工作

StreamReader reader = new StreamReader(fileName, Encoding.GetEncoding(1251));
var serializer = new JsonSerializer() { CheckAdditionalContent = false };
var obj1 = serializer.Deserialize(reader, typeof(Type1));
var obj2 = serializer.Deserialize(reader, typeof(Type2));
这段代码只读取第一个对象,并在读取第二个对象时抛出exeption。我做错了什么?json.net甚至可以完成我的任务吗?提前谢谢

考虑到本主题中的一些建议,我将代码修改为:

using (FileStream fs = File.Open(fileName, FileMode.Open))
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1251)))
using (JsonTextReader jr = new JsonTextReader(sr))
{

     JsonSerializer serializer = new JsonSerializer()
     {
            Formatting = Newtonsoft.Json.Formatting.Indented,
            CheckAdditionalContent = false,
            TypeNameHandling = TypeNameHandling.Auto

     };
     var data1 = serializer.Deserialize(jr, typeof(Type1));

     var data2 = serializer.Deserialize(jr, typeof(List<Type2>));
}
使用(FileStream fs=File.Open(fileName,FileMode.Open))
使用(StreamReader sr=newstreamreader(fs,Encoding.GetEncoding(1251)))
使用(JsonTextReader jr=新的JsonTextReader(sr))
{
JsonSerializer serializer=新的JsonSerializer()
{
格式化=Newtonsoft.Json.Formatting.Indented,
CheckAdditionalContent=false,
TypeNameHandling=TypeNameHandling.Auto
};
var data1=序列化程序。反序列化(jr,typeof(Type1));
var data2=序列化程序。反序列化(jr,typeof(List));
}

但它仍然不能正常工作。似乎在读取第一个对象后,我的光标不会立即停在它的末尾,而是停在第二个对象的某个地方。因此,我的阅读器无法再读取任何对象。

更新:最新的JSON.NET主机现在通过在
JsonReader
上设置
SupportMultipleContent
来支持这一点


据我所知,JSON.NET不支持此功能,因此我决定实现此功能。结果是,用法如下所示:

var reader = new JsonTextReader(
    new StreamReader(fileName, Encoding.GetEncoding(1251)));
var serializer = new JsonSerializer { CheckAdditionalContent = false };
var obj1 = serializer.Deserialize(reader, typeof(Type1));
var obj2 = serializer.Deserialize(reader, typeof(Type2));

您需要在此处显式使用
JsonTextReader
,因为这是保存从
TextReader

读取的字符的方法。这个问题再次被提出,这里有一个很好的工作示例:

以下是我基于上述链接的测试代码:

var reader = new JsonTextReader(Console.In);
reader.SupportMultipleContent = true;
var serializer = new JsonSerializer();

while (reader.Read())
{
    try
    {
        var message = serializer.Deserialize<string>(reader);
        Console.WriteLine("Got message: {0}", message);
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception.Message);
    }
}
var reader=newjsontextreader(Console.In);
reader.SupportMultipleContent=true;
var serializer=new JsonSerializer();
while(reader.Read())
{
尝试
{
var message=序列化程序。反序列化(读取器);
WriteLine(“获取消息:{0}”,消息);
}
捕获(异常)
{
Console.WriteLine(异常消息);
}
}

希望这对某人有所帮助。

它按预期工作<代码>{}{}不是有效的json。我之所以这样做,是因为有时候我不需要读取所有的对象。有时我只需要第一和第二个。如果我只是将我的对象放在一个json中,我将不得不解析所有的对象。我需要分别解析每个对象,以便能够决定哪些对象不应该被解析。@I4V为什么?您处于位置0,读取整个第一个JSON对象,并在读取整个对象后停止。现在,您处于第二个对象开始的位置,因此可以重复该过程。不需要分隔符。@svick如果您是Json序列化程序的编写者,它会工作的。但事实并非如此(或者您已经开发了一个我不知道的json序列化程序)。(我指的是著名的json序列化程序)看看twitters流式API是如何工作的。它一行一行地发送jsons对象,确保json中没有换行符。更新后的代码适合我,假设您在我的更改中使用json.NET版本。这在一定程度上有所帮助。现在我面临着另一种问题。出于某种原因,当我的序列化程序开始读取第二个对象时,它会以“反序列化对象时意外标记:EndObject.Path“”,第5行,位置2”的形式退出。我已经在我的问题中添加了一个文件内容。@PanCotzky它适合我。虽然使用第二个值,但类型必须是一个集合,例如
Type2[]
。我发现下一个对象没有反序列化,因为光标不是停在第一个对象的末尾,而是停在后面几行。似乎解析器不是逐行读取文件,而是通过获取整串行来读取文件。你以前遇到过这样的问题吗?@PanCotzky我写的代码你用过吗?正如我所说,在这里使用
JsonTextReader
是很重要的,没有它,你会看到你描述的东西。是的,我就是这么做的。你真的为自己试过了吗?可能是我的读卡器配置不正确?我将在问题中编写我的新代码。