C# 使用JSON.NET解析JSON对象流的正确方法是什么?

C# 使用JSON.NET解析JSON对象流的正确方法是什么?,c#,json.net,C#,Json.net,我有一个JSON对象流,看起来有点像这样: {...}{...}{...}{...}... 因此基本上是一个JSON对象的串联列表,没有任何分隔符。 使用JSON.NET将这些反序列化为IEnumerable的正确方法是什么?那一刻,我尝试了类似的方法 var serializer = new JsonSerializer(); serializer.CheckAdditionalContent = false; using (var reader = new StreamReader(st

我有一个JSON对象流,看起来有点像这样:

{...}{...}{...}{...}...
因此基本上是一个JSON对象的串联列表,没有任何分隔符。 使用JSON.NET将这些反序列化为
IEnumerable
的正确方法是什么?那一刻,我尝试了类似的方法

var serializer = new JsonSerializer();
serializer.CheckAdditionalContent = false;

using (var reader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(reader)) {
    reader.SupportMultipleContent = true;
    reader.Read();
    while (reader.TokenType != JsonToken.None) {
        yield return serializer.Deserialize<TResult>(reader);
    }
}

显然,我需要在
反序列化
调用后移动读卡器,但我该如何做呢?

我认为如果您稍微改变一下循环,一切都应该正常:

public IEnumerable<TResult> ReadJson<TResult>(Stream stream)
{
    var serializer = new JsonSerializer();

    using (var reader = new StreamReader(stream))
    using (var jsonReader = new JsonTextReader(reader))
    {
        jsonReader.SupportMultipleContent = true;

        while (jsonReader.Read())
        {
            yield return serializer.Deserialize<TResult>(jsonReader);
        }
    }
}
示例:


JsonNet站点上的示例:

谢谢,我以前试过,但在你的小提琴演奏之后,我检查了我的JSON流,发现它并不像预期的那样(用逗号分隔,而不是没有分隔符)。所以这确实是正确的答案,我只需要修复JSON流。SupportMultipleContent做什么?文档没有意义-多个json内容意味着什么?@AmbroseLeung:我相信它告诉
JsonTextReader
文档中存在多个json片段。这个问题提到单个对象流(
{}{}{}
),这就是为什么这个属性是必需的。
public IEnumerable<TResult> ReadJson<TResult>(Stream stream)
{
    var serializer = new JsonSerializer();

    using (var reader = new StreamReader(stream))
    using (var jsonReader = new JsonTextReader(reader))
    {
        jsonReader.SupportMultipleContent = true;

        while (jsonReader.Read())
        {
            yield return serializer.Deserialize<TResult>(jsonReader);
        }
    }
}
using (var stream = /* some stream */)
{
    IEnumerable<MyClass> result = ReadJson<MyClass>(stream);

    foreach (var item in result)
    {
        Console.WriteLine(item.MyProperty);
    }
}