NewtonsoftのJSONシリアライザからJSONのDateTimeの解析
質問
私はNewtonsoftのJSONシリアライザを使用してオブジェクトをシリアライズしました、と日時はなどを通じて来てます:
/Date(1237588418563+0000)/
ときI $ .evalJSON()その上で、それが対象ですが、私はそれににtoUTCStringのような任意の通常の日付の方法を見つけることができません。
任意のアイデアを、私はこれで何ができるか?
解決
より良いフォーマットを取得するには日付を扱うためJson.NETが付属してJsonConvertersのいずれかを使用します。 JavaScriptDateTimeConverterは自動的にJavaScriptの日付が得られます。
public class LogEntry
{
public string Details { get; set; }
public DateTime LogDate { get; set; }
}
[Test]
public void WriteJsonDates()
{
LogEntry entry = new LogEntry
{
LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),
Details = "Application started."
};
string defaultJson = JsonConvert.SerializeObject(entry);
// {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}
string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
// {"Details":"Application started.","LogDate":new Date(1234656000000)}
string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());
// {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}
}
ドキュメント:ののシリアライズ日付でJson.NETとJSON のの
他のヒント
私はいくつかのに役立つかもしれない別のアプローチを思い付きました。基本的に私は、私はそれを必要とするとき、私は呼び出すことをのCustomDateConverter の自分を作成します。コンバータは2つのパラメータ、日付形式をとり、例えばyyyy-MM-dd HH:mm:ss
と私はUTCからユーザーのタイムゾーンに日付を変換することができますのTimeZoneInfo、ます:
public class JSONCustomDateConverter : DateTimeConverterBase
{
private TimeZoneInfo _timeZoneInfo;
private string _dateFormat;
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
{
_dateFormat = dateFormat;
_timeZoneInfo = timeZoneInfo;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
writer.Flush();
}
あなたはこのようにそれを使用することができます:
var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
もちろん、あなたが唯一のカスタムの日付の書式設定をしたい場合は、タイムゾーンに関連したものを削除することができます。私が助けたということを知ってみましょう!
Newtonsoft Json.Netバージョン4.5r5のとして、あなたはJsonPropertyAttribute Classクラスを使用し、そのItemConverterTypeプロパティのプロパティを設定します。 使用方法:
// class to be serialized
public class MyClass
{
[JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
public DateTime? DateTime1;
public DateTime? DateTime2;
}
私はこれが宣言されていないだけで1前にこのクラスのすべてのプロパティに対してDateTimeConverterを設定します観察してきたように。
同じ問題に遭遇した、とアダムからのリンクに基づいて解決策を見つけます:
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
これは、Javascriptを簡単に日付オブジェクトに変換することができるUnixタイムスタンプ、のように見えます。 - 0
は、私はあなたがsubstr
のルックスが好きではない場合は、同様にそれをNumber()
ことができると思います... Javascriptを整数として- 0
出力を処理するために、単純です。
JSONオブジェクトは、次のようなものが含まれています:
var data = {"CreatedDate":"/Date(1327572000000-1000)/"});
///
var oddDateTimeZone = data.CreatedDate;
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));
しかし、まだそれは日付関数がevalのようなものを使用せずに解雇してJSONオブジェクトを修正する方が良いでしょう()またはウィンドウ[]。たぶんjQueryのインチわからない。
+
することができ、オフセットとだけのために-
ないことを忘れてはいけないオフセット!
申し訳ありませんが、私は単純化ビット@Jamesニュートン・キング
string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
これは私のために動作します。