我正在向我的服务器接收 JSON 数据,日期表示如下:
{
"startDate": {
"d": "/Date(1346454000000)/"
},
"slots": [
{
"d": "/Date(1347058800000)/"
},
{
"d": "/Date(1347145200000)/"
}
]
}
它序列化为一个简单的对象:
public class SlotsVm
{
public DateTime StartDate { get; set; }
public DateTime[] Slots { get; set; }
}
因为日期格式很奇怪,我不得不编写一个自定义的 JsonConverter 来处理它。为了反序列化,我使用如下代码:
var slotsVm = JsonConvert.DeserializeObject<SlotsVm>(body,
new CustomDateTimeConverter());
如果可能的话,我希望需要在SlotsVm
类上定义转换器,而不是在实际进行转换的代码中定义转换器。对于使用属性的 startDate
属性,这是可能的:
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime StartDate { get; set; }
但是Slots
是不可能的,它是一个数组而不是一个简单的DateTime
。
对我来说,最好能够在类本身上定义类所需的转换器:
[JsonConverters(typeof(CustomDateTimeConverter), ...]
public class PutDealVm
{
}
但似乎没有办法做到这一点。
你能想到解决方案吗?有没有办法为我错过的类定义转换器?或者,是否可以定义数组应为其每个元素使用的转换器?
这样的事情呢?我很欣赏这可能不会直接回答你的问题,但我懒得重新创建CustomDateTimeConverter
类,所以想出了这个,这可以说更简单,因为不需要自定义转换器。
string json = "{"startDate": {"d": "/Date(1346454000000)/"},"slots": [{"d": "/Date(1347058800000)/"},{"d": "/Date(1347145200000)/"}]}";
SlotsVmDeserialized slotsVmDeserialized =
JsonConvert.DeserializeObject<SlotsVmDeserialized>(json);
SlotsVm slotsVm = new SlotsVm()
{
Slots = slotsVmDeserialized.Slots.Select(d => d.Date),
StartDate = slotsVmDeserialized.StartDate.Date
};
....
public class SlotsVm
{
public DateTime StartDate { get; set; }
public IEnumerable<DateTime> Slots { get; set; }
}
public class SlotsVmDeserialized
{
public DateObject StartDate { get; set; }
public IEnumerable<DateObject> Slots { get; set; }
}
public class DateObject
{
[JsonProperty("d")]
public DateTime Date { get; set; }
}
我在这里所做的是首先反序列化为 SlotsVmDeserialized
类,该类用于保存单个DataObject
和 IEnumerable。DateObject
类本质上是我对自定义转换器的替代/解决方法。我本可以通过删除[JsonProperty("d")]
并将Data
重命名为 D
来完成所有这些没有任何属性。
反序列化后,我根据SlotsVmDeserialized
对象的属性创建一个新的SlotsVm
对象。