Reputation: 8605
I have the following classes:
internal class RequestPayload1
{
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string Date { get; set; }
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string State { get; set; }
[DataMember]
[JsonProperty]
internal string Properties { get; set; }
}
internal class RequestPayload2
{
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string Id { get; set; }
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string Name { get; set; }
[DataMember]
[JsonProperty]
internal string Location { get; set; }
}
I created an object of the two classes EntityEvent1 and EntityEvent2 class like this:
RequestPayload1 payload1 = new RequestPayload1()
{
Date = "date1",
State = "state1",
Properties = "properties1"
};
RequestPayload2 payload2 = new RequestPayload2()
{
Id = "id1",
Name = "name1",
Location = "location1"
};
I have a class:
internal class RequestData
{
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string RequestHeader { get; set; }
[DataMember]
[JsonProperty(Required = Required.Always)]
internal JObject RequestPayload { get; set; }
}
I need the RequestPayload to be set to either RequestPayload1 or RequestPayload2. That is the reason I used the type JObject for it. But when I serialize the payloads like this, the RequestPayload is getting the object in an invalid Json format. Mainly the double quotes replaced with single quotes:
string requestPayload1 = JsonConvert.SerializeObject(payload1);
RequestData requestData1 = new RequestData()
{
RequestHeader = "requestHeader1",
RequestPayload = new JObject(payload1);
};
string requestPayload2 = JsonConvert.SerializeObject(payload2);
RequestData requestData2 = new RequestData()
{
RequestHeader = "requestHeader2",
RequestPayload = new JObject(payload2);
}
requestData1 and requestData2 when deserialized are giving:
"Request": {
"RequestHeader": "requestHeader1",
"RequestPayload": {'Date':'date1','State':'state1', 'Properties':'properties1'}""
}
"Request": {
"RequestHeader": "requestHeader2",
"RequestPayload": "{'Id':'id1','Name':'name1', 'Location':'location1'}"
}
How can I change this so that requestData1 and requestData2 are:
"Request": {
"RequestHeader": "requestHeader2",
"RequestPayload": {
"Date":"Date",
"State":"state1",
"Properties":"properties1"
}
}
"Request": {
"RequestHeader": "requestHeader2",
"RequestPayload": {
"Id":"id1",
"Name":"name1",
"Location":"location1"
}
}
I probably have to change the type of RequestPayload to something other than JObject, but not sure which one.
Upvotes: 0
Views: 78
Reputation: 2727
If it can be either, it might not be best practice, someone might correct me on this.
If you create an interface for your RequestPayloads called: IRequestPayload
It can be empty.
Inherit from the interface like so:
public interface IRequestPayload{}
internal class RequestPayload1 : IRequestPayload
{
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string Date { get; set; }
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string State { get; set; }
[DataMember]
[JsonProperty]
internal string Properties { get; set; }
}
internal class RequestPayload2 : IRequestPayload
{
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string Id { get; set; }
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string Name { get; set; }
[DataMember]
[JsonProperty]
internal string Location { get; set; }
}
Then instead of JObject, use IRequestPayload
internal class RequestData
{
[DataMember]
[JsonProperty(Required = Required.Always)]
internal string RequestHeader { get; set; }
[DataMember]
[JsonProperty(Required = Required.Always)]
internal IRequestPayload RequestPayload { get; set; }
}
Sorry, interfaces don't serialize correctly if I recall, here is a solution: https://stackoverflow.com/a/18147504/1888402
EDIT
You could also use a base class in a similar way to the interface, you're then associating your request payload classes with a parent class i.e. BaseRequestPayload
and then use that for your type.
Upvotes: 1