Web Api 2 - 自定义数据类型 JSON 序列化
Web Api 2 - custom data type JSON serialization
我实际上是网络新手 Api,所以我的问题听起来有点奇怪。
我有简单的 API 到 return 有关价格变化的历史信息。我的控制器的操作如下所示:
[HttpGet]
[Route("api/history/{id}/{size}")]
public async Task<IEnumerable<PriceHistoryRecordModel>> GetHistory(string id, Size size)
PriceHistoryRecordModel 是
[DataContract]
public class PriceHistoryRecordModel
{
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public double Value { get; set; }
}
但是,问题是 - 操作 returns JSON 格式如下
[{"Date":"2016-02-07T08:22:46.212Z","Value":17.48},{"Date":"2016-02-08T09:34:01.212Z","Value":18.37}]
但是,由于客户对数据格式的特定要求,我需要 JSON 这样看
[[1238371200000,17.48],[1238457600000,18.37]]
所以,我想知道
- 是否有办法实现这种自定义序列化?
- 我可以将此自定义序列化包装在属性中并将其用作方面吗?
你可以这样写 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);
}
}
指定我们的class被这个转换器序列化:
[JsonConverter(typeof(CustomCoverter))]
[DataContract]
public class PriceHistoryRecordModel
{
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public double Value { get; set; }
}
它可以工作,但如果您只需要在这种特定情况下进行这种特殊处理,就会有点开销。
如果你有很多类似的情况,你可以让你的 classes 实现一个基础 class 并为所有这些 classes 使用这个转换器。
在这种简单的情况下,一个快速的解决方案就是将 return 类型更改为 double[]
:
public async Task<IEnumerable<double[]>> GetHistory(string id, Size size)
并使用 DateTime.Ticks
将您的日期时间转换为数字
我实际上是网络新手 Api,所以我的问题听起来有点奇怪。
我有简单的 API 到 return 有关价格变化的历史信息。我的控制器的操作如下所示:
[HttpGet]
[Route("api/history/{id}/{size}")]
public async Task<IEnumerable<PriceHistoryRecordModel>> GetHistory(string id, Size size)
PriceHistoryRecordModel 是
[DataContract]
public class PriceHistoryRecordModel
{
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public double Value { get; set; }
}
但是,问题是 - 操作 returns JSON 格式如下
[{"Date":"2016-02-07T08:22:46.212Z","Value":17.48},{"Date":"2016-02-08T09:34:01.212Z","Value":18.37}]
但是,由于客户对数据格式的特定要求,我需要 JSON 这样看
[[1238371200000,17.48],[1238457600000,18.37]]
所以,我想知道
- 是否有办法实现这种自定义序列化?
- 我可以将此自定义序列化包装在属性中并将其用作方面吗?
你可以这样写 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);
}
}
指定我们的class被这个转换器序列化:
[JsonConverter(typeof(CustomCoverter))]
[DataContract]
public class PriceHistoryRecordModel
{
[DataMember]
public DateTime Date { get; set; }
[DataMember]
public double Value { get; set; }
}
它可以工作,但如果您只需要在这种特定情况下进行这种特殊处理,就会有点开销。
如果你有很多类似的情况,你可以让你的 classes 实现一个基础 class 并为所有这些 classes 使用这个转换器。
在这种简单的情况下,一个快速的解决方案就是将 return 类型更改为 double[]
:
public async Task<IEnumerable<double[]>> GetHistory(string id, Size size)
并使用 DateTime.Ticks