Json.NET IsoDateTimeConverter不使用Stripe.Net库中的类

时间:2014-10-13 22:26:39

标签: asp.net json asp.net-web-api json.net stripe.net

我正在使用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)/
}

2 个答案:

答案 0 :(得分:1)

问题是Stripe.Net库中的StripeInvoice类标有[JsonConverter]个属性,因此所有DateTime属性都使用StripeDateTimeConverter。该转换器始终以/Date(1412657602)/格式写出日期,您可以在source code中看到。据推测,这是为了让班级与Stripe REST API一起正常工作,AutoMapper显然不使用ISO 8601日期。

你有几个选择来解决这个问题:

  1. 最直接的选项就是将发票数据从StripeInvoice复制到您自己的Invoice类版本,并从Web API返回,而不是直接通过StripeInvoice对消费者而言老实说,这可能是您最好的选择,因为它将您的数据源(Stripe)的顾虑与您自己的API的顾虑分开。您可以使用IContractResolver之类的内容来帮助复制数据。
  2. 当您在Web API中对它们进行序列化时,应该可以创建自定义{{3}}以使用StripeDateTimeConverter动态替换Stripe.Net类中的IsoDateTimeConverter(请参阅下面的更新) )。
  3. Stripe.Net库是开源的;您可以根据自己的需要修改代码,以便根据上下文打开或关闭StripeDateTimeConverter。这可能是三者中最糟糕的选择,因为每次更新库时,您都必须重新应用自定义更改。
  4. <强>更新

    如果您对第二种方法感兴趣,可以选择合同解析器:

    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' }}

我希望这有助于解决这个问题的指导方针。