JObject内存不足

4

当我尝试解析一个大约有 200mbjson 文件时,遇到了问题。我使用的是 Newtonsoft.Json 库。它抛出了 OutOfMemory 异常。

这是我的代码:

using (StreamReader sr=File.OpenText("path"))
        {
            JObject file= (JObject)JToken.ReadFrom(new JsonTextReader(sr));
        }

我该如何做到这一点?(最好使用JObject)
1个回答

4
您可以使用JsonTextReaderDataReader的方式读取文本,如此问题所述:在C#中进行逐步JSON解析。您将需要编写自己的逻辑来处理JSON数据,但它肯定会解决您的内存问题。
using (var reader = new JsonTextReader(File.OpenText("path")))
{
    while (reader.Read())
    {
        // Your logic here (anything you need is in [reader] object), for instance:
        if (reader.TokenType == JsonToken.StartArray)
        {
            // Process array
            MyMethodToProcessArray(reader);
        }
        else if (reader.TokenType == JsonToken.StartObject)
        {
            // Process object
            MyMethodToProcessObject(reader);
        }
    }
}

您实际上将构建一个递归的JSON解析器。


似乎 var property=jsonReader.TokenType.PropertyName; 不起作用。它说“无法使用实例引用访问 PropertyName;请改为使用类型名称限定”。 - Cosmin
1
我更新了答案并添加了一些示例代码。使用JsonTextReader就像从头开始创建解析器(如果您的JSON结构很复杂,则需要相当多的工作),但是,如果您感觉舒适,它将允许您避免内存问题。 - German Latorre
谢谢。但是我如何从那个文件中访问字段呢?对于较小的JSON文件,我会这样做:我会创建一个JObject并遍历它,然后可以像这样访问元素item["field_name"].Value<string>()。我该如何使用reader实现这个功能? - Cosmin
2
reader.TokenTypeJsonToken.PropertyName时,这意味着您刚刚读取了JSON字段(或属性)的名称。您可以在reader.Value中访问属性的名称。下一次调用reader.Read()将读取该属性的值,该值也将放置在reader.Value中。这很容易,但是需要一定量的代码,就像我告诉过你的那样。 - German Latorre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接