自定义JSON编码结构

时间:2013-06-02 22:16:20

标签: c# json asp.net-mvc-4

我有一个结构,用于将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

我知道我可以在结构上添加一个getter来让它像我不想要的那样输出,但是我希望这与字符串或int类型的工作方式类似。如果没有完全重做Json.Encode,这可能是不可能的?

谢谢!

1 个答案:

答案 0 :(得分: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。

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