自定义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.net,然后让我知道:
- 使用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); } }
-
在
UnixDateTime
结构体之上添加[JsonConverter(typeof(UnixDateJsonConverter))]
-
使用
Newtonsoft.Json.JsonConvert.SerializeObject
代替Json.Encode
转换成json
如果有人知道没有json.net的更好的方法,我会给你答案。Json.net已经在我的项目中了,所以它成功了。