【问题标题】:What is the correct way to use JSON.NET to parse stream of JSON objects?使用 JSON.NET 解析 JSON 对象流的正确方法是什么?
【发布时间】:2014-10-28 05:43:51
【问题描述】:

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

{...}{...}{...}{...}...

所以基本上是一个没有任何分隔符的 JSON 对象的串联列表。 使用 JSON.NET 将它们反序列化为 IEnumerable<T> 的正确方法是什么?目前我尝试了类似

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);
    }
}

但这失败了

Newtonsoft.Json.JsonSerializationException: Unexpected token while deserializing object: EndObject. Path '', line 1, position 55.
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
  at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
  at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)

显然我需要在Deserialize 调用之后移动阅读器,但我该怎么做呢?

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    我认为如果你稍微改变一下你的循环,一切都应该工作:

    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);
            }
        }
    }
    

    请注意,当传递给此方法的 Stream 处于打开状态时,您必须遍历 IEnumerable&lt;TResult&gt;

    using (var stream = /* some stream */)
    {
        IEnumerable<MyClass> result = ReadJson<MyClass>(stream);
    
        foreach (var item in result)
        {
            Console.WriteLine(item.MyProperty);
        }
    }
    

    示例: https://dotnetfiddle.net/Y2FLuK

    JsonNet 网站上的示例:Read Multiple Fragments With JsonReader

    【讨论】:

    • 谢谢,我之前尝试过,但在你的小提琴之后,我检查了我的 JSON 流,发现它不是预期的(逗号分隔而不是没有分隔符)。所以这确实是正确的答案,我只需要修复 JSON 流。
    • SupportMultipleContent 是做什么的?文档没有意义 - 多条 json 内容是什么意思?
    • @AmbroseLeung:我相信它告诉JsonTextReader 文档中存在多个 JSON 片段。该问题提到了一个对象流 ({}{}{}),这就是为什么该属性是必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2023-03-23
    • 2013-10-14
    • 2013-05-31
    相关资源
    最近更新 更多