我正在與各種端點上的API進行通信。所有響應在meta
中都有一些共享字段,然後是一個可包含任意數量自定義對象的data
對象。CustomJsonConverter將一個字段反序列化爲JSON,其中一個字段可能是多個自定義對象
的幾個例子: 1)一種有效載荷返回data
含有accounts[]
{
"meta": {
"timestamp": "2017-07-14T12:59:34-04:00",
"code": 200
},
"data": {
"accounts": [
{
"address": "Main Street",
"country": "US",
"email": "[email protected]",
"city": "MyTown",
"accountName": "MyAccount",
"account": 123456,
"contact": ""
}
]
}
}
2)有效載荷返回data
含有shipments[]
{
"meta": {
"timestamp": "2017-07-14T13:46:42-04:00",
"code": 400
},
"data": {
"shipments": [
{
"distributionCenter": "123",
"packages": [
{
"packageDetails": {},
"consigneeAddress": {},
"errors": [
{
"errorCode": "VALIDATION_ERROR",
"errorId": 0,
"errorMessage": "INVALID_LOGIN"
}
],
],
"status": {
"timestamp": "2017-07-14T13:46:42-0400",
"numAccepted": 0,
"numRejected": 1,
"code": "ERROR"
},
}
]
}
}
我需要有訪問shipments[]
當我打shipments
端點,與accounts[]
相同時點擊accounts
端點。所以data.accounts[0].email
是可以訪問的。
這樣做的破解方式似乎創建了一個具有所有可能的對象類型的類,所以當序列化/反序列化發生時,那些不存在的就是空。
public class ApiResponse
{
public Meta meta { get; set; }
public Data data { get; set; }
}
public class Meta
{
public string code { get; set; }
public DateTime timestamp { get; set; }
}
public class Data
{
public Account[] accounts { get; set; }
public Shipment[] shipments { get; set; }
}
但我想知道是否有辦法用Newtonsoft JSON自定義JsonConverter做到這一點。薩Data
類的樣子:
[JsonConverter(typeof(DataConverter))]
public class Data
{
\\not sure what to put here...
}
如何讓ReadJson認識到自定義對象的任何輸入?或者在其他json.net的方式來完成這個?
class DataConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(Data));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value.GetType() == Shipment)
/// this throws error "not valid type in this context"
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}
*我想知道是否有一種方法可以使用自定義的JsonConverter * - 你想讓你的'Data'類型看起來像什麼?你在哪裏應用轉換器? – dbc
對「數據」的外觀沒有什麼看法 - 只會更喜歡不必'{get; set;}'爲每個可能的對象類型(只給出了兩個例子,但我正在處理6+對象類型''數據'可以包含)。添加了我在上面應用轉換器的示例 – dbJones
當您碰到相應的端點時,API是否具有有關它在數據中返回的對象類型的文檔?它必須公開這些信息。 – niksofteng