1

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

}

但似乎没有办法做到这一点。

你能想出解决办法吗?有没有办法为我错过的类定义转换器?或者,是否可以定义数组应为其每个元素使用的转换器?

4

1 回答 1

1

这样的事情呢?我很欣赏这可能无法直接回答您的问题,但我懒得重新创建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")]并重命名DataD.

SlotsVm反序列化后,我会根据对象的属性创建一个新SlotsVmDeserialized对象。

于 2012-10-20T05:17:09.597 回答