指定具有 Json.net 属性的 Json转换器



我正在向我的服务器接收 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对象。

相关内容

  • 没有找到相关文章

最新更新