Я пытаюсь сериализовать (и десериализовать) мои объекты в. NET (стандарт), используя последнюю версию NewtonSoft. JSON.
Вот мои классы:
public class BaseRequest
{
public string UserName{ get; set; }
}
Запрос, производный от BaseRequest
(у меня есть много других таких классов, производных от BaseRequest
):
public class GetDeviceRequest : BaseRequest
{
public string SerialNumber { get; set; }
}
Запрос, который я сериализую в Json, создается с помощью класса :
public class CommunicationRequest
{
public CommunicationRequest() { }
public CommunicationRequest(BaseRequest baseRequest, string version ="1.1")
{
this.Version = version;
this.Request = baseRequest;
}
public string Version { get; set; } = "1.1";
public BaseRequest Request { get; set; }
}
Код, который я использую для сериализации. Я еще не тестировал десериализацию, но она должна работать так же
GetDeviceRequest getDeviceRequest = new GetDeviceRequest()
{
SerialNumber = "123456789",
UserName = "john.doe"
};
CommunicationRequest request = new CommunicationRequest(getDeviceRequest);
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(request, settings);
Что я получаю как JSON:
{
"version":"1.1",
"request":{
"serialNumber":"123456789",
"username":"john.doe"
}
}
Что я хочу:
{
"version":"1.1",
"getDeviceRequest":{
"serialNumber":"123456789",
"username":"john.doe"
}
}
Мне нужно динамически изменить JsonProperty
имя Request
на GetDeviceRequest
в зависимости от имени производного класса.
Что я мог бы сделать:
[JsonProperty("DerievedClassName")]
public BaseRequest Request { get; set; }
Это явно не работает для меня, потому что объект не был создан, и я не могу заставить тип использовать что-то вроде Request.GetType()
.
Казалось бы, способ состоит в том, чтобы реализовать мой ICustomContractResolver
, но я не могу получить рабочий CustomContractResolver
для моего варианта использования.
Есть ли способ, которым я могу сериализовать, как я хочу?