【问题标题】:Custom JSON serialization in ServiceStackServiceStack 中的自定义 JSON 序列化
【发布时间】:2014-06-09 13:22:02
【问题描述】:

我正在尝试在 ServiceStack(版本 4.0.21.0)中自定义 JSON 序列化。根据 ServiceStack 文档here JSON 序列化可以使用某种结构进行自定义。

问题在于 Web 服务调用上的序列化似乎只以一种方式发生,而不是另一种。 ParseJson 方法永远不会被调用:

public struct Time
{
    private const string FORMAT = "yyyy-MM-dd HH:mm:ss";

    public DateTime Value { get; set; }

    public override string ToString()
    {
        return Value.ToString(FORMAT);
    }

    public static Time ParseJson(string json)
    {
        var d = DateTime.ParseExact(json, FORMAT, CultureInfo.InvariantCulture);

        return new Time{Value = d};
    }
}

这是一个错误还是我做错了?

【问题讨论】:

    标签: .net servicestack


    【解决方案1】:

    是的,这似乎是一个错误。我通过将 struct 更改为 class 使其工作(尽管文档声称它应该是一个结构)。现在 ParseJson 被调用,但 ToString 没有:)

    添加一个配置设置修复了那个:

    JsConfig<Time>.SerializeFn = t => t.ToString();
    

    这反过来又导致了适当的解决方案,即。配置 DateTime 序列化并直接使用它而不是 Time 类:

    JsConfig<DateTime>.SerializeFn = t => t.ToString(FORMAT);
    JsConfig<DateTime>.DeSerializeFn = s => DateTime.ParseExact(s, FORMAT, CultureInfo.InvariantCulture);
    

    【讨论】:

      【解决方案2】:

      这不是个好主意。

      JsConfig<DateTime>.SerializeFn = t => t.ToString(FORMAT);
      JsConfig<DateTime>.DeSerializeFn = s => DateTime.ParseExact(s, FORMAT, CultureInfo.InvariantCulture);
      

      此方案适用于全局设置,但对日期时间格式的要求不同。如果生日是“yyyy-MM-dd”,但 dateCreated 是“yyyy-MM-dd HH:mm:ss”。

      public string Updatetime { get; set; }
      

      datetime 属性是字符串,我手动转换它。我从 datebase 中读取 datetime 和 format for web api.so 它序列化,但不是 DeSerialize,这是一个坏主意,但它很容易使用。

      ServiceStack.Text 中的ToJson() 能否支持ToJson(new DateTimeConverter { DateTimeFormat = "yyyy/MM/dd" })?因此,我们可以将日期时间转换为特定格式。这是个好主意。

      【讨论】:

        猜你喜欢
        • 2014-12-12
        • 2013-01-01
        • 1970-01-01
        • 2011-02-25
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多