我有一个结构,用于将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,这可能是不可能的?
谢谢!
答案 0 :(得分:2)
我有这个工作,如果你知道如何在没有JSON.net的情况下做到这一点,那么请告诉我:
创建以下类:
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);
}
}
在[JsonConverter(typeof(UnixDateJsonConverter))]
结构上方添加UnixDateTime
。
使用Newtonsoft.Json.JsonConvert.SerializeObject
代替Json.Encode
将其变成json。
如果有人知道在没有json.net的情况下更好的方法,我会给你答案。 Json.net已经在我的项目中,所以它已经成功了。