一次反序列化一个项目的json数组流

ZNS*_*ZNS 32 c# serialization json stream json.net

我将一个大对象数组序列化为json http响应流.现在我想一次一个地从流中反序列化这些对象.是否有任何c#库可以让我这样做?我看过json.net,但似乎我必须立即反序列化完整的对象数组.

[{large json object},{large json object}.....]
Run Code Online (Sandbox Code Playgroud)

澄清:我想一次从流中读取一个json对象并反序列化它.

Bri*_*ers 49

为了逐步读取JSON,您需要JsonTextReader结合使用a StreamReader.但是,您不一定要从阅读器手动读取所有JSON.您应该能够利用Linq-To-JSON API从阅读器加载每个大对象,以便您可以更轻松地使用它.

举个简单的例子,假设我有一个看起来像这样的JSON文件:

[
  {
    "name": "foo",
    "id": 1
  },
  {
    "name": "bar",
    "id": 2
  },
  {
    "name": "baz",
    "id": 3
  }
]
Run Code Online (Sandbox Code Playgroud)

从文件中逐步读取它的代码可能如下所示.(在您的情况下,您将使用响应流替换FileStream.)

using (FileStream fs = new FileStream(@"C:\temp\data.json", FileMode.Open, FileAccess.Read))
using (StreamReader sr = new StreamReader(fs))
using (JsonTextReader reader = new JsonTextReader(sr))
{
    while (reader.Read())
    {
        if (reader.TokenType == JsonToken.StartObject)
        {
            // Load each object from the stream and do something with it
            JObject obj = JObject.Load(reader);
            Console.WriteLine(obj["id"] + " - " + obj["name"]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上输出如下:

1 - foo
2 - bar
3 - baz
Run Code Online (Sandbox Code Playgroud)

  • 这与我提出的解决方案基本相同.除了我做一个新的JsonSerializer().反序列化<T>(读者); 而不是JObject.Load.我不确定JsonTextReader如何管理流数据. (3认同)