我正在与各种端点上的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