2015-12-10 61 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

我很高興聽到@羅蒙諾夫! –