C# 如何直接从流中反序列化非常大的JSON数据,而不是一次加载整个JSON

C# 如何直接从流中反序列化非常大的JSON数据,而不是一次加载整个JSON,c#,json,json.net,C#,Json,Json.net,可能重复: 以下问题是相关的,但不涉及(至少直接)我试图解决的问题: 我正在尝试使用反序列化潜在的非常大的JSON数据。我不希望将整个文件加载到内存中,并使用JObject.parse(JsonFullString)解析JSON,而是希望逐个令牌读取流令牌并构建对象图。如果您能就如何从流中实现反序列化提出任何建议,我将不胜感激 注意:我的目的是用更好的实现替换以下代码 string jsonData = string.Empty; byte[] buffer

可能重复:

以下问题是相关的,但不涉及(至少直接)我试图解决的问题:

我正在尝试使用反序列化潜在的非常大的JSON数据。我不希望将整个文件加载到内存中,并使用
JObject.parse(JsonFullString)
解析JSON,而是希望逐个令牌读取流令牌并构建对象图。如果您能就如何从流中实现反序列化提出任何建议,我将不胜感激

注意:我的目的是用更好的实现替换以下代码


      string jsonData = string.Empty;
      byte[] buffer = new byte[16 * 1024];
      using (MemoryStream ms = new MemoryStream())
      {
          int read;
          while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
          {
              ms.Write(buffer, 0, read);
          }
          jsonData = ASCIIEncoding.ASCII.GetString(ms.ToArray());
       }                    
       JObject jObject = JObject.Parse(jsonData);
       var entities = from e in jObject.Root
                      select e;
好主意!
我认为你能做的是:

  • 首先创建对象
  • 像您现在所做的那样,逐块在循环中读取流
  • 在您读过的每个块之前,检查它是否包含一个标记(如果其中有逗号“,”)
  • 如果没有找到逗号-读取另一个块(在本例中可能是较小的块?)
  • 拆分逗号前的文本(data.Split(“:”),并借助反射或硬编码循环,如果不需要支持所有可能的对象,请将值指定给属性
  • 继续循环

  • 这并不是说我不介意投票,而是我看到的json解析器就是这样工作的。很高兴知道你们认为我错在哪里,因为生活并不是那么容易。这只是一个简单的例子
    {“delimeter1”:“,”和“delimeter2”:“}”}
    。还有数组、数组数组、嵌套对象、转义非ascii字符等。