【问题标题】:Is there a way to return DateTime in ISO format from a asp .net web method instead of JSON format?有没有办法从 asp .net web 方法而不是 JSON 格式返回 ISO 格式的 DateTime?
【发布时间】:2015-12-10 08:37:36
【问题描述】:

目前,经典 asp .net 中的 Web 方法或大多数方法使用 system.web.script.serialization.javascriptserializer 类进行序列化,这将返回 javascript 对象的日期时间成员,其值例如为

"/日期(刻度数)/"

。我知道这是一个臭名昭著的问题,大多数人建议在我们收到数据后使用某种转换器,或者将数据作为字符串而不是对象返回。

例如类

public class Person
{
    public String Name { get; set; }
    public int Age { get; set; }
    public DateTime DOB { get; set; }
}

如果通过带有 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 装饰的 System.Web.Services.WebMethod 返回,则响应将在 result.d 中返回,如下所示

{Name:"Steve", Age:30, DOB:"/Date(1249335477787)/"};

我们需要应用一些代码将 DOB 转换为 ISO 格式或其他可接受的格式。

但我只是想看看是否有人进行了某种响应调整或使用覆盖的类从 Web 方法返回 DateTime 值。有没有办法覆盖 javascriptserializer 的功能并在 asp .net web 方法中使用它,以便它直接以 ISO 格式返回日期?我知道它可以通过几种方式在 asp .net MVC 中完成。

在 asp .net web 表单的 web 方法中也可以这样做吗?这也将节省大量代码和错误:)

【问题讨论】:

  • 您可以使用 newtonsoft 编写自己的自定义 json 序列化器
  • 是的,但是我如何告诉 WebMethod 使用这个新的自定义序列化程序来返回对象。我也不想将它作为字符串返回:(
  • ISO JSON 格式。您是否正在使用(已弃用的)JavaScriptSerializer?

标签: c# asp.net .net json webmethod


【解决方案1】:

我从http://blog.icanmakethiswork.io/2012/04/beg-steal-or-borrow-decent-javascript.html发现了一个技巧。

这是为了替换JsonSerializer自带的日期序列化器,使用自定义的日期序列化器。

  • 覆盖 System.Web.Script.Serialization.JavaScriptConverter
  • 更新 web.config 部分以将其应用于整个项目或使用 RegisterConverters 函数在本地使用它

这可以让我返回一个 ISO 格式的日期时间,我还可以将这个内部时刻 js 传递给 javascript 内部的操作。

【讨论】:

【解决方案2】:

您可以轻松地在 webmethod 中声明响应类型。您也可以使用link 中描述的自定义序列化程序,或查看以下代码以了解如何格式化日期:

class DualDateJsonConverter : JsonConverter
{

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

        JObject result = new JObject();

        DualDate dd = (DualDate)value;

        result.Add("DateOne", JToken.FromObject(dd.DateOne.ToString("MM.dd.yyyy")));
        result.Add("DateTwo", JToken.FromObject(dd.DateTwo));
        result.WriteTo(writer);
    }

    // Other JsonConverterMethods
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DualDate);
    }

    public override bool CanWrite
    {
        get
        {
            return true;
        }
    }
    public override bool CanRead
    {
        get
        {
            return false;
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
 Context.Response.ContentType = "application/json";
 Context.Response.Write(response);

【讨论】:

  • 我认为响应类型已经是正确的,OP 不喜欢的是日期格式...
  • @AdrianoRepetti 这是否意味着您可以贡献我的答案?您是否完全阅读了我的回答?
  • 仅供参考(重要的是)我没有否决您的答案,但是是的,我完全阅读了它,即使在第二次阅读之后,我也不明白响应类型与问题有什么关系...
  • @AdrianoRepetti 引用问题评论“是的,但是我如何告诉 WebMethod 使用这个新的自定义序列化程序来返回对象。我也不想将它作为字符串返回: ( "
  • AFAIK 更改内容类型不会影响 JavaScript 序列化程序如何转换日期(如果他想要 ISO 格式,它必须是字符串)。 OP可能会澄清这一点
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多