, . JsonConverter, , , . JsonConverters ; .
, , , IContractResolver.
. , "type name" ( , , ) IValueProvider, , . ( , , .)
- DefaultContractResolver, Json.Net. CreateProperties() , .
:
class CustomResolver : DefaultContractResolver
{
private string customTypePropertyName;
private IValueProvider valueProvider = new SimpleTypeNameProvider();
public CustomResolver(string customTypePropertyName)
{
this.customTypePropertyName = customTypePropertyName;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
if (type.IsClass && type != typeof(string))
{
props.Insert(0, new JsonProperty
{
DeclaringType = type,
PropertyType = typeof(string),
PropertyName = customTypePropertyName,
ValueProvider = valueProvider,
Readable = true,
Writable = false
});
}
return props;
}
class SimpleTypeNameProvider : IValueProvider
{
public object GetValue(object target)
{
return target.GetType().Name;
}
public void SetValue(object target, object value)
{
return;
}
}
}
, JsonSerializerSettings. :
class Program
{
static void Main(string[] args)
{
Person p = new Person
{
Id = 2,
Name = "Peter",
Employer = new Company
{
Id = 5,
Name = "Initech"
}
};
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CustomResolver("MyTypeName"),
Formatting = Formatting.Indented
};
string json = JsonConvert.SerializeObject(p, settings);
Console.WriteLine(json);
}
}
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Company Employer { get; set; }
}
class Company
{
public int Id { get; set; }
public string Name { get; set; }
}
:
{
"MyTypeName": "Person",
"Id": 2,
"Name": "Peter",
"Employer": {
"MyTypeName": "Company",
"Id": 5,
"Name": "Initech"
}
}