.net/mono で動作し、Newtonsoft.Json を使用して情報をシリアル化するマルチプラットフォーム アプリケーションを作成しています。
まったく同じバージョンの Newtonsoft.Json.dll を使用してマシン間で情報を送信しようとするまでは、すべてうまく機能していました。
日付が"2013-02-08T12:11:39Z"のように ISO 形式で適切にシリアル化されていることが判明しましたが、Mac OS でそれらを逆シリアル化しようとすると、DateTime オブジェクトではなく文字列が返されます!
シリアライザーの設定を使用していくつかの実験を行いました。
private static readonly JsonSerializerSettings jsonSettings = new JsonSerializerSettings {
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateParseHandling = DateParseHandling.DateTime,
Converters = new JsonConverter [] { new Newtonsoft.Json.Converters.IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-ddTHH:mm:ssZ" } }
};
JsonConvert.DeserializeObject<object> ("\"2013-02-08T10:11:51Z\"", jsonSettings);
しかし、結果はまったく同じ文字列"2013-02-08T10:11:51Z"までです。さらに実験を行ったところ、まったく同じ設定を使用しても、そのように日付をシリアル化および逆シリアル化できないことがわかりました。
JsonConvert.DeserializeObject<object>(JsonConvert.SerializeObject(DateTime.Now, jsonSettings), jsonSettings);
ISO の日付を表す文字列がまだ取得されます。その後、私もこれを試しました:
JsonConvert.DeserializeObject<object>(JsonConvert.SerializeObject(DateTime.Now));
そして今、結果として適切な DateTime オブジェクトを取得します。しかし、次のコードを実行すると、日付がシリアル化される方法が正確には ISO 形式ではないことがわかります。
JsonConvert.SerializeObject(DateTime.Now);
"\"2013-02-08T12:22:25.974177+02:00\""のようなものを返しますが、これは標準ではなく、通信できません。
最も奇妙な部分は、そのような問題のない Mac を備えたクライアントがあったことです。これはOSに何らかの関係があると思い始めていますが、私が指定した正確なフォーマットはそれを修正しませんか?