Вы можете реализовать конвертер Json:
Это сопоставляет свойства варианта со свойством, которое вы хотите установить.
public class CustomFieldConverter : JsonConverter
{
private readonly Dictionary<string, string> _propertyMappings = new Dictionary<string, string>
{
{"EmployeeMstr", "CustomProperty"},
{"HrNewHire", "CustomProperty"},
{"Payroll", "CustomProperty"}
};
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return objectType.GetTypeInfo().IsClass;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
object instance = Activator.CreateInstance(objectType);
var props = objectType.GetTypeInfo().DeclaredProperties.ToList();
JObject jo = JObject.Load(reader);
foreach (JProperty jp in jo.Properties())
{
if (!_propertyMappings.TryGetValue(jp.Name, out var name))
name = jp.Name;
PropertyInfo prop = props.FirstOrDefault(pi =>
pi.CanWrite && pi.GetCustomAttribute<JsonPropertyAttribute>().PropertyName == name);
prop?.SetValue(instance, jp.Value.ToObject(prop.PropertyType, serializer));
}
return instance;
}
}
Вы должны установить атрибут в классе, где Ваше пользовательское свойство его.
[JsonConverter(typeof(CustomFieldConverter))]
public class Data
подробный пример вы можете увидеть здесь:
https://www.jerriepelser.com/blog/deserialize-different-json-object-same-class/
Вы можете использовать JObject в качестве типа CustomProperty, позволяющий отображать отдельные json объекты. Но я думаю, что ваш код останется чем-то непонятным.
Другой способ - сопоставить это свойство с классом с такой структурой:
public class CustomProperty
{
[JsonProperty("TableName")]
public string TableName{ get; set; }
[JsonProperty("Data")]
public Dictionary<string, object> Properties { get; set; }
}
An загружает свойства в словаре с помощью JsonConverter