gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:23:53 64 4
gpt4 key购买 nike

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

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

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

的东西
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 之后移动阅读器打电话,但我该怎么做?

最佳答案

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

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

请注意,您必须遍历 IEnumerable<TResult>Stream传递给此方法的是打开的:

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

关于c# - 使用 JSON.NET 解析 JSON 对象流的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26601594/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com