C#で日時をJSONにシリアライズするフォーマット指定を完全解説!初心者向けガイド
生徒
「C#で日時をJSONに変換するとき、変な形式で出力されてしまうことがあります。好きな形に変更する方法はありますか?」
先生
「はい、C#では日時をシリアライズするときにフォーマットを自由に指定できます。設定次第で見やすく、扱いやすい形に整えることができます。」
生徒
「どうやって指定すればいいんですか?難しい設定が必要なんでしょうか?」
先生
「実はとても簡単です。これから、基本的な方法を順番に説明していきます。」
C#で日時をJSONにシリアライズするとどうなる?
C#で日時(DateTime)をJSONに変換するとき、特に設定をしないままだと、標準の形式で出力されます。標準形式では、「UNIX時間」や「ISO 8601形式」など、人間には読みづらい形で表現されることがあります。
例えば、システムの既定形式では次のような出力になり、初めて見ると意味が分かりづらいかもしれません。
2025-12-01T10:30:00.000Z
これは国際標準のISO 8601形式で、「T」は日時の区切り、「Z」は世界標準時(UTC)を表しています。初心者にとっては読み解きにくいため、自由にフォーマットを指定する方法を知ることはとても重要です。
日時フォーマットを指定してJSONにシリアライズする方法
C#では、JSONのシリアライズに使われるライブラリとして主に以下があります。
- System.Text.Json(.NET標準)
- Newtonsoft.Json(広く利用されているライブラリ)
ここでは、実務でもよく使われるNewtonsoft.Jsonを例に日時フォーマットを指定する方法を説明します。
using Newtonsoft.Json;
using System;
public class Sample
{
public DateTime CreatedAt { get; set; }
}
var sample = new Sample
{
CreatedAt = new DateTime(2025, 12, 1, 10, 30, 0)
};
var settings = new JsonSerializerSettings
{
DateFormatString = "yyyy/MM/dd HH:mm:ss"
};
string json = JsonConvert.SerializeObject(sample, settings);
Console.WriteLine(json);
この例では、yyyy/MM/dd HH:mm:ssという形式で出力されます。これは、「西暦4桁/月2桁/日2桁 時:分:秒」の順番で読みやすい形になります。
{"CreatedAt":"2025/12/01 10:30:00"}
System.Text.Jsonでフォーマット指定する方法
最近のC#では、標準のSystem.Text.Jsonもよく使われます。この場合はカスタムコンバータを使う必要があります。
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
=> DateTime.Parse(reader.GetString());
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
}
var options = new JsonSerializerOptions
{
Converters = { new DateTimeConverter() }
};
var obj = new { Time = DateTime.Now };
string json = JsonSerializer.Serialize(obj, options);
Console.WriteLine(json);
{"Time":"2025-12-01 10:30:00"}
このように、ライブラリによって設定方法は異なりますが、目的は日時を読みやすく整えることです。
日時フォーマットの主な例一覧
格式は自由に変えられます。よく使われる形式をまとめました。
- yyyy-MM-dd:2025-12-01
- HH:mm:ss:10:30:00
- yyyy-MM-ddTHH:mm:ssZ:ISO 8601形式(国際標準)
- yyyy/MM/dd HH:mm:ss:日本で一般的な形式
目的に応じて使い分けられるようになると、JSONデータの管理が格段に楽になります。
まとめ
C#における日時のJSONシリアライズ処理は、システム開発において避けては通れない非常に重要なテーマです。デフォルトの状態では、私たちが普段目にしている「2026年1月31日」といった形式ではなく、ISO 8601形式などの機械的な文字列として出力されてしまいます。これを放置すると、外部APIとの連携時にエラーが発生したり、フロントエンド側での日付処理が複雑になったりと、予期せぬトラブルを招く原因になりかねません。
開発現場で役立つ実践的なテクニック
これまでに紹介した通り、Newtonsoft.JsonやSystem.Text.Jsonといった主要なライブラリを使用することで、日付フォーマットの制御は驚くほど柔軟に行えます。特に、日本国内向けの業務システムであれば「yyyy/MM/dd HH:mm:ss」といった形式が好まれますし、グローバルなサービスであればミリ秒まで含めたUTC表記が求められることもあります。
また、シリアライズだけでなく「デシリアライズ(JSONからオブジェクトへの復元)」の際も、フォーマットが一致していないと解析に失敗します。一貫性のある設定をプロジェクト全体に適用することが、保守性の高いコードを書くための第一歩と言えるでしょう。
C#での応用的なサンプルプログラム
さらに理解を深めるために、複数の日付プロパティを持つクラスをシリアライズする実戦的なコードを見てみましょう。ここでは、Newtonsoft.Jsonを使用して、プロパティごとに異なるフォーマットを適用する手法も交えて紹介します。
using System;
using Newtonsoft.Json;
using System.Collections.Generic;
public class InventoryReport
{
public string ItemName { get; set; }
// プロパティ単位でフォーマットを指定することも可能
[JsonProperty("inspection_date")]
[JsonConverter(typeof(Newtonsoft.Json.Converters.IsoDateTimeConverter), "yyyy-MM-dd")]
public DateTime InspectionDate { get; set; }
public DateTime UpdatedAt { get; set; }
}
public class Program
{
public static void Main()
{
var report = new InventoryReport
{
ItemName = "サーバー機器",
InspectionDate = new DateTime(2026, 1, 31),
UpdatedAt = DateTime.Now
};
// グローバルな設定
var settings = new JsonSerializerSettings
{
DateFormatString = "yyyy/MM/dd HH:mm:ss",
Formatting = Formatting.Indented // 見やすく整形
};
string jsonOutput = JsonConvert.SerializeObject(report, settings);
Console.WriteLine(jsonOutput);
}
}
上記のコードを実行すると、次のようなJSONが出力されます。
{
"ItemName": "サーバー機器",
"inspection_date": "2026-01-31",
"UpdatedAt": "2026/01/31 10:45:22"
}
他言語との連携:COBOLでの日付処理について
エンタープライズな開発現場では、C#で作成したWeb APIが、メインフレーム上のCOBOLプログラムとデータをやり取りするケースも珍しくありません。COBOLでは日付を文字列や数値として扱うのが一般的ですが、現代的なCOBOL(Enterprise COBOLなど)では、JSON生成をサポートする構文も存在します。
C#側でフォーマットを整えておくことは、こうしたレガシーシステムや異なる言語環境とのデータ交換をスムーズにするための「思いやり」でもあります。例えば、COBOL側で扱いやすい「YYYYMMDD」形式でJSONを出力する場合、C#では DateFormatString = "yyyyMMdd" と設定するだけで対応可能です。
SEOを意識した日付操作のポイント
Web開発において、JSONに含まれる日付データそのものが直接検索エンジンにインデックスされることは稀ですが、構造化データ(JSON-LD)として出力する場合は話が別です。Googleなどの検索エンジンが正しく日付を認識するためには、シリアライズ時に正しい形式で出力されている必要があります。 「C# JSON 日付 変換」や「System.Text.Json フォーマット指定」といったキーワードで検索する開発者が求めているのは、単なるコードの書き方だけではありません。その設定がシステム全体にどのような影響を及ぼすかという「納得感」です。
生徒
先生、まとめありがとうございました!C#でDateTimeを扱うとき、ライブラリの設定ひとつでこんなに柔軟に形を変えられるんですね。プロパティごとに個別に指定できる [JsonConverter] 属性はすごく便利そうです!
先生
その通りです。プロジェクト全体で統一したいときは JsonSerializerSettings を使い、特定の項目だけ特殊な形式にしたいときは属性を使う、といった使い分けができるようになると中級者への一歩ですね。特にWeb APIを開発するときは、フロントエンド側のJavaScriptが扱いやすい ISO 8601 形式にするか、それとも人間が見て分かりやすい形式にするか、チーム内で事前に決めておくのがコツですよ。
生徒
なるほど。あと、COBOLの話が出てきたのも驚きました。古いシステムとの連携でも、JSONのフォーマット指定が架け橋になるんですね。データの形式を合わせることは、プログラミング言語の壁を越えるために必要なスキルなんだと感じました。
先生
良い気づきですね。日付や時刻は、一見シンプルですがタイムゾーンやうるう秒など、奥が深い要素がたくさんあります。まずは自分の思い通りの文字列としてJSONに出力できるよう、今回学んだ方法を実際のコードで試してみてください。エラーが出たときに、どこのフォーマットがズレているのかを突き止める力も養われますよ。
生徒
はい!さっそく自分のプロジェクトでも、System.Text.Json のカスタムコンバータを実装してみようと思います。ありがとうございました!