using Newtonsoft.Json.Serialization;
using System.Collections;
using System.Collections.Generic;
using JsonSerializer = System.Text.Json.JsonSerializer;
using NewtonsoftJsonSerializer = Newtonsoft.Json.JsonSerializer;
public static void Main()
var originalData = new Dictionary<string, object>
{ "Name", "Old Product Name" },
{ "UpdatedAt", new DateTime(2023, 12, 1, 10, 0, 0) },
{ "Item", new Dictionary<string, object>
{ "Name", "Old Product Name" },
{ "UpdatedAt", new DateTime(2023, 12, 1, 10, 0, 0) },
{ "ItemChild", new Dictionary<string, object>
{ "Name", "Old Product Name" },
{ "UpdatedAt", new DateTime(2023, 12, 1, 10, 0, 0) }
var currentData = new Dictionary<string, object>
{ "Name", "New Product Name" },
{ "UpdatedAt", new DateTime(2024, 4, 30, 9, 30, 0) }
var settings = new JsonSerializerSettings
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new DepthLimitingContractResolver(2)
var originalJson = JsonConvert.SerializeObject(originalData, settings);
var currentJson = JsonConvert.SerializeObject(currentData, settings);
Console.WriteLine(originalJson);
Console.WriteLine(currentJson);
public class DepthLimitingContractResolver : DefaultContractResolver
private readonly int _maxDepth;
private int _currentDepth;
public DepthLimitingContractResolver(int maxDepth)
protected override JsonContract CreateContract(Type objectType)
JsonContract contract = base.CreateContract(objectType);
if (_currentDepth >= _maxDepth &&
(objectType.IsClass || objectType.IsInterface) &&
objectType != typeof(string))
contract.Converter = new DepthLimitingConverter();
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
var properties = base.CreateProperties(type, memberSerialization);
public class DepthLimitingConverter : JsonConverter
public override bool CanConvert(Type objectType)
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, NewtonsoftJsonSerializer serializer)
throw new NotImplementedException("Unnecessary because CanRead is false.");
public override bool CanRead => false;
public override void WriteJson(JsonWriter writer, object value, NewtonsoftJsonSerializer serializer)
if (value is IEnumerable && !(value is string))
writer.WriteStartArray();
writer.WriteStartObject();