我正在使用ASP.NET Web API。我有以下代码,并且在序列化为JSON时,response
IEnumerable<StripeInvoice>
中的日期未转换为ISO 8601格式。它们采用Microsoft .NET格式,如/Date(1412657602)/
。使用IsoDateTimeConverter()
应转换为ISO 8601格式,例如2011-07-14T19:43:37+0100
。为什么这不适用于IEnumerable<StripeInvoice>
?
IEnumerable<StripeInvoice> response = service.List();
string json = JsonConvert.SerializeObject(response, new IsoDateTimeConverter());
修改
以下是我的Web API控制器的完整方法。
public IEnumerable<StripeInvoice> GetUserInvoices(string id)
{
var options = new StripeInvoiceListOptions()
{
CustomerId = id
};
// Using https://github.com/jaymedavis/stripe.net stripe library
var invoiceService = new StripeInvoiceService();
invoiceService.ApiKey = "key";
IEnumerable<StripeInvoice> response = invoiceService.List(options);
// test
IEnumerable<SomeObject> objs = new SomeObject[] {
new SomeObject() { SomeDate = DateTime.Now.AddDays(-1) },
new SomeObject() { SomeDate = DateTime.Now }
};
// return objs; // this serialized the dates properly into ISO 8601
return response; // this doesn't serialize to ISO 8601. It remains in /Date(142657602)/
}
答案 0 :(得分:1)
问题是Stripe.Net库中的StripeInvoice
类标有[JsonConverter]
个属性,因此所有DateTime
属性都使用StripeDateTimeConverter
。该转换器始终以/Date(1412657602)/
格式写出日期,您可以在source code中看到。据推测,这是为了让班级与Stripe REST API一起正常工作,AutoMapper显然不使用ISO 8601日期。
你有几个选择来解决这个问题:
StripeInvoice
复制到您自己的Invoice
类版本,并从Web API返回,而不是直接通过StripeInvoice
对消费者而言老实说,这可能是您最好的选择,因为它将您的数据源(Stripe)的顾虑与您自己的API的顾虑分开。您可以使用IContractResolver
之类的内容来帮助复制数据。StripeDateTimeConverter
动态替换Stripe.Net类中的IsoDateTimeConverter
(请参阅下面的更新) )。StripeDateTimeConverter
。这可能是三者中最糟糕的选择,因为每次更新库时,您都必须重新应用自定义更改。<强>更新强>
如果您对第二种方法感兴趣,可以选择合同解析器:
class ForceIsoDateTimeResolver : DefaultContractResolver
{
private JsonConverter dateConverter = new IsoDateTimeConverter();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty prop = base.CreateProperty(member, memberSerialization);
// For any DateTime property on any class, replace the
// existing converter with an IsoDateTimeConverter.
if (prop.PropertyType == typeof(DateTime) ||
prop.PropertyType == typeof(DateTime?))
{
prop.Converter = dateConverter;
}
return prop;
}
}
要将此解析程序安装到Web API项目中,请将以下内容添加到Register
类的WebApiConfig
方法中(在Web API项目的App_Start
文件夹中):
JsonSerializerSettings settings = config.Formatters.JsonFormatter.SerializerSettings;
settings.ContractResolver = new ForceIsoDateTimeResolver();
答案 1 :(得分:0)
我遇到了同样的问题,但我通过从/Date(...)/中获取unix时间并将该值乘以1000来修复它 最后使用角度的日期函数,如此代码。
{{(x.created | limitTo : 10 : 6) * 1000 | date: 'yyyy-MM-dd HH:mm:ss Z' }}
我希望这有助于解决这个问题的指导方针。