Web Api 2-自定义数据类型JSON序列化

Use*_*iev 3 c# serialization json asp.net-web-api2

我实际上是Web Api的新手,所以我的问题听起来有点奇怪。

我有简单的API,可以返回有关价格变化的历史信息。我的控制器的动作如下所示:

[HttpGet]
[Route("api/history/{id}/{size}")]
public async Task<IEnumerable<PriceHistoryRecordModel>> GetHistory(string id, Size size)
Run Code Online (Sandbox Code Playgroud)

PriceHistoryRecordModel在哪里

[DataContract]
public class PriceHistoryRecordModel
{
    [DataMember]
    public DateTime Date { get; set; }

    [DataMember]
    public double Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,问题是-操作以以下格式返回JSON

[{"Date":"2016-02-07T08:22:46.212Z","Value":17.48},{"Date":"2016-02-08T09:34:01.212Z","Value":18.37}]
Run Code Online (Sandbox Code Playgroud)

但是,由于特定客户端对数据格式的要求,我需要使用JSON来显示这种方式

[[1238371200000,17.48],[1238457600000,18.37]]
Run Code Online (Sandbox Code Playgroud)

所以,我想知道

  • 是否有办法实现这种自定义序列化?
  • 我可以将此自定义序列化包装到属性中并将其用作一个方面吗?

Kha*_* TO 5

您可以这样写CustomConverter

public class CustomCoverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            PriceHistoryRecordModel obj = value as PriceHistoryRecordModel;
            JToken t = JToken.FromObject(new double[] { obj.Date.Ticks, obj.Value });
            t.WriteTo(writer);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override bool CanConvert(Type objectType)
        {
            return typeof(PriceHistoryRecordModel).IsAssignableFrom(objectType);
        }
    }
Run Code Online (Sandbox Code Playgroud)

指定我们的类已通过此转换器序列化:

[JsonConverter(typeof(CustomCoverter))]
[DataContract]
public class PriceHistoryRecordModel
{
    [DataMember]
    public DateTime Date { get; set; }

    [DataMember]
    public double Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是如果在这种情况下只需要这种特殊处理,那是一种开销。

如果您有许多类似的情况,则可以让您的类实现一个基类,并将此转换器用于所有这些类。

在这种简单情况下,一种快速的解决方案是将您的返回类型更改为double[]

public async Task<IEnumerable<double[]>> GetHistory(string id, Size size)

并通过使用将您的日期时间转换为数字 DateTime.Ticks