2015-12-10 65 views
0

我有以下类:C#:插入JSON对象

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; } 
} 

我创建这样的两个类EntityEvent1和EntityEvent2类的对象:

RequestPayload1 payload1 = new RequestPayload1() 
{ 
    Date = "date1", 
    State = "state1", 
    Properties = "properties1" 
}; 

RequestPayload2 payload2 = new RequestPayload2() 
{ 
    Id = "id1", 
    Name = "name1", 
    Location = "location1" 
}; 

我有一个类:

internal class RequestData 
{ 
    [DataMember] 
    [JsonProperty(Required = Required.Always)] 
    internal string RequestHeader { get; set; } 

    [DataMember] 
    [JsonProperty(Required = Required.Always)] 
    internal JObject RequestPayload { get; set; } 
} 

我需要将RequestPayload设置为RequestPayload1或RequestPayload2。这就是我为它使用JObject类型的原因。但是当我像这样序列化有效负载时,RequestPayload以无效的Json格式获取对象。

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和requestData2反序列化是给时:主要是双引号用单引号替换

"Request": { 
    "RequestHeader": "requestHeader1", 
    "RequestPayload": {'Date':'date1','State':'state1', 'Properties':'properties1'}"" 
    } 

"Request": { 
    "RequestHeader": "requestHeader2", 
    "RequestPayload": "{'Id':'id1','Name':'name1', 'Location':'location1'}" 
    } 

我怎样才能改变这种做法,requestData1和requestData2是:

"Request": { 
    "RequestHeader": "requestHeader2", 
    "RequestPayload": { 
     "Date":"Date", 
     "State":"state1", 
     "Properties":"properties1" 
    } 
    } 

"Request": { 
    "RequestHeader": "requestHeader2", 
    "RequestPayload": { 
     "Id":"id1", 
     "Name":"name1", 
     "Location":"location1" 
    } 
    } 

我可能必须将RequestPayload的类型更改为JObject以外的其他类型,但不确定哪一个。

+1

如果你只是使用Object,会发生什么? –

+0

这是最简单的解决方案。请把它写成答案。我会将其标记为解决方案。 – Romonov

回答

1

如果可以,也许不是最佳实践,有人可能会纠正我。

如果您为RequestPayloads创建了一个名为:IRequestPayload的接口,它可以为空。

继承的接口,像这样:

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; } 
} 

然后,而不是JObject,使用IRequestPayload

internal class RequestData 
{ 
    [DataMember] 
    [JsonProperty(Required = Required.Always)] 
    internal string RequestHeader { get; set; } 

    [DataMember] 
    [JsonProperty(Required = Required.Always)] 
    internal IRequestPayload RequestPayload { get; set; } 
} 

对不起,接口不正确序列化,如果我还记得,这里是一个解决方案:https://stackoverflow.com/a/18147504/1888402

编辑

您也可以以类似的方式使用基类,然后将请求负载类与父类(即BaseRequestPayload)关联,然后将其用于您的类型。

+0

让我知道如何为你工作 –

+0

我用基类对象,它的工作。 – Romonov

+0

我很高兴听到@罗蒙诺夫! –