using System; using System.Collections.Generic; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace Needle.Engine.Samples.Helpers { public class PropertyRenameAndIgnoreSerializerContractResolver : DefaultContractResolver { private readonly Dictionary> _ignores; private readonly Dictionary> _renames; public PropertyRenameAndIgnoreSerializerContractResolver() { _ignores = new Dictionary>(); _renames = new Dictionary>(); } public void IgnoreAllObsolete(Type type) { const BindingFlags flags = BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public; foreach (var member in type.GetMembers(flags)) { if (member.GetCustomAttribute() != null) continue; var name = member.Name; if (name.StartsWith("get_")) name = name.Substring("get_".Length); else if (name.StartsWith("set_")) name = name.Substring("set_".Length); // Debug.Log("Ignore obsolete " + type.Name + "." + name); IgnoreProperty(type, name); } } public void IgnoreProperty(Type type, params string[] jsonPropertyNames) { if (!_ignores.ContainsKey(type)) _ignores[type] = new HashSet(); foreach (var prop in jsonPropertyNames) { var set = _ignores[type]; if (!set.Contains(prop)) set.Add(prop); } } public void RenameProperty(Type type, string propertyName, string newJsonPropertyName) { if (!_renames.ContainsKey(type)) _renames[type] = new Dictionary(); _renames[type][propertyName] = newJsonPropertyName; } protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); if (IsIgnored(property.DeclaringType, property.PropertyName)) { property.ShouldSerialize = i => false; property.Ignored = true; } if (IsRenamed(property.DeclaringType, property.PropertyName, out var newJsonPropertyName)) property.PropertyName = newJsonPropertyName; return property; } private bool IsIgnored(Type type, string jsonPropertyName) { if (!_ignores.ContainsKey(type)) return false; return _ignores[type].Contains(jsonPropertyName); } private bool IsRenamed(Type type, string jsonPropertyName, out string newJsonPropertyName) { Dictionary renames; if (!_renames.TryGetValue(type, out renames) || !renames.TryGetValue(jsonPropertyName, out newJsonPropertyName)) { newJsonPropertyName = null; return false; } return true; } } }