using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public string Id { get { return "A:ID"; } }
[JsonProperty("CompKey")]
public string CompKey { get; set; }
public new string Id { get { return "B:ID"; } }
public string Name { get; set; }
public class DatabaseEntryResolver : DefaultContractResolver
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
var property = base.CreateProperty(member, memberSerialization);
if (member.ReflectedType == typeof(B))
if (member.Name == nameof(A.Id) && member.DeclaringType != typeof(A))
public class DatabaseEntryResolver : V1.DatabaseEntryResolver
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
var properties = base.CreateProperties(type, memberSerialization);
properties = properties.Where(p => p.UnderlyingName == nameof(A.Id)).ToList();
public class DatabaseEntryResolver : DefaultContractResolver
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
var property = base.CreateProperty(member, memberSerialization);
if (typeof(A).IsAssignableFrom(member.ReflectedType))
if (member.Name == nameof(A.Id) && member.DeclaringType != typeof(A))
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
var properties = base.CreateProperties(type, memberSerialization);
if (typeof(A).IsAssignableFrom(type))
properties = properties.Where(p => p.UnderlyingName == nameof(A.Id)).ToList();
public class DatabaseEntryResolver : DefaultContractResolver
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
return base.GetSerializableMembers(objectType).Where(member => member.DeclaringType == typeof(A)).ToList();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => property.DeclaringType == typeof(A);
public static void Test()
Test<V1.DatabaseEntryResolver>();
Test<V2.DatabaseEntryResolver>();
Test<V3.DatabaseEntryResolver>();
Test<RyanFalzon.DatabaseEntryResolver>();
public static void Test<DatabaseEntryResolver>() where DatabaseEntryResolver : DefaultContractResolver, new()
Console.WriteLine("\nTesting {0}", typeof(DatabaseEntryResolver).FullName);
var resolver = new DatabaseEntryResolver();
resolver.ResolveContract(typeof(B));
var settings = new JsonSerializerSettings
ContractResolver = resolver,
var jsonA = JsonConvert.SerializeObject(new A(), Formatting.Indented, settings);
Console.WriteLine("JSON for {0}", nameof(A));
Console.WriteLine(jsonA);
var jsonB = JsonConvert.SerializeObject(new B(), Formatting.Indented, settings);
Console.WriteLine("JSON for {0}", nameof(B));
Console.WriteLine(jsonB);
Assert.IsTrue(!jsonB.Contains("B:ID"));
Assert.IsTrue(jsonB.Contains("A:ID"));
Assert.IsTrue(jsonA.Contains("A:ID"));
public static partial class JsonExtensions
public static string ToDebugString(this MemberInfo property)
return property == null ? "" : string.Format("{{{0} (for {1} Declared in {2}, reflected in {3}{4})}}", property, property.Name, property.DeclaringType.Name, property.ReflectedType.Name);
public static string ToDebugString(this JsonProperty property)
return property == null ? "" : string.Format("{{{0} (for {1} Declared in {2}{5})}}", property, property.UnderlyingName, property.DeclaringType.Name, property.Ignored ? " (Ignored)" : "");
public static string ToDebugString(this (MemberInfo member, JsonProperty property) pair)
return pair.property == null ? "" : string.Format("{{{0} (for {1} Declared in {2}, Reflected from {3}{4})}}", pair.property, pair.member.Name, pair.member.ReflectedType, pair.member.DeclaringType, pair.property.Ignored ? " (Ignored)" : "");
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Assembly.GetName().Name, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.Location.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];