Romonov
Romonov

Reputation: 8605

C#: Insert a json object

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

Answers (1)

ZeroBased_IX
ZeroBased_IX

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

Related Questions