1

问题

我有一个非常大的 JSON 文件,我需要将其反序列化为 .NET 对象。为此,我使用 Newtonsoft.Json JsonTextReader。在本地计算机上,反序列化过程运行没有错误,并且 .NET 对象完全填充了文件中的值。当我将代码发布到 Azure Api 服务时,反序列化将不起作用。

当试图解析在本地工作的同一个文件时,我得到了这个异常:

Newtonsoft.Json.JsonSerializationException:无法将当前 JSON 数组(例如 [1,2,3])反序列化为“模板”类型,因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。路径 'p2[0].p35[1].p125.p35[2].p125.p36[0].p200',第 1 行,位置 35681。

我检查了对象结构并将其与 JSON 文件进行了比较。所示路径指向 JSON 中的一个数组,该数组应转换为ICollection<Blocks> Blocks.NET 对象中的对象集合。

附加信息

有趣的是,它有时也可以在代码发布后直接在 Azure Api 服务中运行。当异常发生时,重新启动 Api 服务将无济于事,但再次发布相同的代码会修复错误,并且文件会正确反序列化。迟早会再次出现错误,我必须再次发布代码才能摆脱它。

在使用JsonTextReader反序列化我使用的 JSON之前JsonConvert.DeserializeObject<Package>(fileAsString),它工作得很好,但是将整个文件作为一个字符串导致 OutOfMemory 异常与更大的文件。

编码

这是反序列化对象的代码。ContractResolver 用于将JsonPropertyShortenerJSON 文件中的属性替换为较短的名称,以减小文件大小并在反序列化时将它们映射回正确的属性名称。

using (var sr = new StreamReader(pkgStream, Encoding.UTF8))
{
    using (var jsonTextReader = new JsonTextReader(sr))
    {
        serializer.NullValueHandling = NullValueHandling.Include;
        serializer.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
        serializer.ContractResolver = JsonPropertyShortener.GetDeserializer(mapping);
        serializer.Formatting = Formatting.None;
        serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        return serializer.Deserialize<Package>(jsonTextReader);
    }
}

问题

当 Azure Api 服务在本地计算机上正常工作时,为什么反序列化无法在其内正常工作?

我该怎么做才能让它在 Azure Api 服务上运行?

奖励:为什么发布代码可以在一段时间内缓解问题?

4

0 回答 0