gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:50:34 25 4
gpt4 key购买 nike

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

我有简单的 API 来返回有关价格变化的历史信息。我的 Controller 的操作如下所示:

[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; }
}

但是,问题是 - 操作以下列格式返回 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);
}
}

指定我们的类被这个转换器序列化:

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

[DataMember]
public double Value { get; set; }
}

它可以工作,但如果您只需要在这种特定情况下进行这种特殊处理,那就有点开销了。

如果您有很多类似的情况,您可以让您的类实现一个基类并为所有这些类使用这个转换器。

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

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

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

关于c# - Web Api 2 - 自定义数据类型 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com