自定义JSON编码结构

本文关键字:结构 编码 JSON 自定义 | 更新日期: 2023-09-27 18:16:49

我有一个用于转换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添加什么方法到我的结构中。编码正确输出一个整数值?最好,我希望它不输出一个"对象",而是一个"值"…所以我不想要:

"Date": {"Value": 123456}

而是:

"Date": 123456

我知道我可以在struct上添加一个getter来得到我不想要的输出,但我希望它的工作方式类似于string或int类型的工作方式。也许这是不可能没有完全重做Json.Encode?

谢谢!

自定义JSON编码结构

我得到了这个工作,如果你知道一种方法来做到这一点没有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. UnixDateTime结构体之上添加[JsonConverter(typeof(UnixDateJsonConverter))]

  4. 使用Newtonsoft.Json.JsonConvert.SerializeObject代替Json.Encode转换成json

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