2

我有一个将 ASP.NET DateTime 转换为 unix 时间的结构,如下所示:

public struct UnixDateTime
{
    private readonly int _value;

    public UnixDateTime(int value)
    {
        this._value = value;
    }

    public static implicit operator UnixDateTime(DateTime dateTime)
    {
        DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        return new UnixDateTime((int)(dateTime - epoch).TotalSeconds);
    }

    public static implicit operator DateTime(UnixDateTime unixDateTime)
    {
        return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unixDateTime);
    }

    public static implicit operator int(UnixDateTime unixDateTime)
    {
        return unixDateTime._value;
    }

    public static implicit operator string(UnixDateTime unixDateTime)
    {
        return unixDateTime._value.ToString();
    }
}

未经测试,请不要在未经测试的情况下在他们的代码中使用它。

无论如何,当我将此值存储在 ViewModel 中时,将其发送到视图,然后调用:

@Html.Raw(Json.Encode(Model))

它将为该属性输出一个空对象“{}”。

为了让 Json.Encode 正确输出整数值,我需要将哪些方法添加到我的结构中?最好,我希望它不输出“对象”,而是输出“值”......所以我不想要:

"Date": {"Value": 123456}

反而:

"Date": 123456

我知道我可以在结构上添加一个吸气剂,让它像我不想要的那样输出,但我希望它的工作方式类似于 string 或 int 类型的工作方式。如果不完全重做 Json.Encode,这可能是不可能的吗?

谢谢!

4

1 回答 1

2

我得到了这个工作,如果你知道没有 JSON.net 的方法,那么请告诉我:

  1. 使用 Json.net
  2. 创建以下类:

    class UnixDateJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(UnixDateTime));
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // I'll figure this out later
            throw new NotImplementedException();
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
    
            UnixDateTime dt = (UnixDateTime)value;
            serializer.Serialize(writer, (int) dt);
        }
    }
    
  3. 在结构[JsonConverter(typeof(UnixDateJsonConverter))]上方添加。UnixDateTime

  4. 使用Newtonsoft.Json.JsonConvert.SerializeObject而不是Json.Encode将其转换为json。

如果有人知道没有 json.net 的更好方法,我会给你答案。Json.net 已经在我的项目中,所以它成功了。

于 2013-06-02T23:02:17.547 回答