【问题标题】:Json parsing giving OutOfMemory [duplicate]Json解析给出OutOfMemory [重复]
【发布时间】:2017-04-04 06:30:50
【问题描述】:

我对 Json.net 比较陌生。我必须解析我作为 URL 获得的 JSON。

我的代码外观:

var url = "some json url";
using (WebClient wc = new WebClient())
{
    wc.UseDefaultCredentials = true;
    JArray arr = JArray.Parse(wc.DownloadString(url));
    var holdingRecords = arr.ToObject<List<HoldingData>>();
} 

这适用于 ConsoleApp。一旦我把它放在我的 ASP.net 中,wc.DownloadString(url) 就会返回 OutOfMemory 错误。

HoldingData 是一个具有一堆属性的类。 JSON 是结构数组,其中每个结构都是类的属性。

关于如何解决此问题的任何线索。我的 JSON 很大,我正在寻找最佳解决方案。

【问题讨论】:

  • 我的 Json 很大定义很大
  • 有什么理由不使用 HttpClient 代替吗?
  • 谢谢大卫。我正在尝试使用 HttpWebRequest 看看是否有帮助。
  • 如果您能提供 JSON 响应,那就太好了。
  • 同样,我无法提供 json,但它看起来是这样的:

标签: c# json json.net


【解决方案1】:

我使用了类似下面的东西,它可以满足我的需求。但是我想知道是否有更好的方法

using (WebClient client = new WebClient())
            {
                client.UseDefaultCredentials = true;
                using (Stream stream = client.OpenRead(url))
                using (StreamReader streamReader = new StreamReader(stream))
                using (JsonTextReader reader = new JsonTextReader(streamReader))
                {
                    reader.SupportMultipleContent = true;
                    List<HoldingData> hd = new List<HoldingData>();
                    var serializer = new JsonSerializer();
                    while (reader.Read())
                    {
                        if (reader.TokenType == JsonToken.StartObject)
                        {
                            HoldingData c = serializer.Deserialize<HoldingData>(reader);
                            hd.Add(c);
                        }
                    }

                    Console.ReadLine();
                }
            }

【讨论】:

  • 您可以直接反序列化为 List&lt;HoldingData&gt; 而无需循环;重要的是直接流式传输而无需中间 string。请参阅Performance Tips为了最大限度地减少内存使用和分配的对象数量,Json.NET 支持直接序列化和反序列化到流。一次读取或写入 JSON,而不是将整个 JSON 字符串加载到内存中,这在处理 JSON 文档时尤其重要......以避免 JSON 字符串最终进入大型对象堆。
  • 谢谢!你说的对。我能够反序列化为 var listHolding = serializer.Deserialize>(reader);
猜你喜欢
  • 2011-12-06
  • 1970-01-01
  • 2017-07-05
  • 2021-03-21
  • 2013-03-15
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多