使用Newtonsoft JsonConvert反序列化时如何覆盖MaxDepth限制?
问题场景
反序列化一个包含大量嵌套结构的JSON字符串时,抛出深度超出限制的错误:
The reader's MaxDepth of 64 has been exceeded. Path 'function.parameters[1].parameters[2].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[1].parameters[0].parameters[0].parameters[0].parameters', line 1066, position 145
尝试过的无效方案
通过JsonSerializerSettings设置MaxDepth为128,代码如下:
var trigger = JsonConvert.DeserializeObject<Trigger>(json, new JsonSerializerSettings { MaxDepth = 128 });
执行后依然抛出相同的超出64级深度限制的错误。
最终有效解决方案
排查发现代码库中存在自定义的JsonConverter子类,该类重写了库的默认反序列化行为。直接在ReadJson方法开头为JsonReader设置MaxDepth即可解决:
public class BaseConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { reader.MaxDepth = 128; JObject jObject = JObject.Load(reader); var target = Create(objectType, jObject); serializer.Populate(jObject.CreateReader(), target); return target; } }
内容的提问来源于stack exchange,提问作者LazZ

