【发布时间】:2020-04-29 07:13:07
【问题描述】:
我正在尝试使用最新版本的 NewtonSoft.JSON 在 .NET(标准)中序列化(和反序列化)我的对象。
这是我的课程:
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"
}
}
我需要根据派生类的名称将Request 的JsonProperty 名称动态更改为GetDeviceRequest。
我本来可以做的:
[JsonProperty("DerievedClassName")]
public BaseRequest Request { get; set; }
这显然对我不起作用,因为对象没有被实例化,我无法让类型使用像 Request.GetType() 这样的东西。
似乎方法是实现我的ICustomContractResolver,但我无法为我的用例获得一个有效的CustomContractResolver。
有没有一种方法可以按照我想要的方式进行序列化?
【问题讨论】:
标签: c# .net json serialization json.net