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 に答える