System.Text.JsonによるJSON(オプトイン、コンバーター)
C# 6に適したJSON処理として、[DataContract]/[DataMember](メンバーのオプトイン)を付けたDataContractJsonSerializerを使い、コンバーターに近い簡単な名前変更を行います。
「System.Text.JsonによるJSON(オプトイン、コンバーター)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
C# 6 の JSON: 計画
目標: 外部パッケージを使わずに JSON をシリアライズおよびデシリアライズします。
- DataContractJsonSerializer を使用します
- DataMember によってメンバーをオプトインします
- Name= で名前をカスタマイズします
- ファイルを安全に読み書きします
オプトインモデル
オプトインモデルでは、型に DataContract を付け、対象にするメンバーにのみ DataMember を付けます。Name= を使用して JSON のキーを制御します。
using System;
using System.Runtime.Serialization;
[DataContract] // opt-in: only [DataMember] will be serialized
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
// Not included: no DataMember
public string InternalNote { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
User u = new User { Id = 7, Name = "Ada", InternalNote = "hidden" };
Console.WriteLine("Ready to serialize: " + u.Name);
}
}
JSON へのシリアライズ
DataContractJsonSerializer を作成し、ストリームに書き込んでから、UTF-8 で文字列にエンコードします。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
[DataContract]
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
public string InternalNote { get; set; }
}
public class Program
{
public static string ToJson(User u)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
using (MemoryStream ms = new MemoryStream())
{
ser.WriteObject(ms, u);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static void Main(string[] args)
{
User u = new User { Id = 1, Name = "Ada", InternalNote = "not saved" };
string json = ToJson(u);
Console.WriteLine(json); // {"id":1,"name":"Ada"}
}
}
JSON からのデシリアライズ
ストリームから読み取ってデシリアライズします。値が設定されるのは DataMember フィールドだけです。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
[DataContract]
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
public class Program
{
public static User FromJson(string json)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
byte[] bytes = Encoding.UTF8.GetBytes(json);
using (MemoryStream ms = new MemoryStream(bytes))
{
return (User)ser.ReadObject(ms);
}
}
public static void Main(string[] args)
{
string json = "{\"id\":42,\"name\":\"Bob\"}";
User u = FromJson(json);
Console.WriteLine(u.Id + " - " + u.Name);
}
}
JSON ファイルの保存と読み込み
using ブロック内で FileStream を使って JSON を永続化します。これは設定や小規模なデータなど、実際のアプリケーションで使われる方法に対応します。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
[DataContract]
public sealed class Settings
{
[DataMember(Name = "theme")]
public string Theme { get; set; }
[DataMember(Name = "notifications")]
public bool Notifications { get; set; }
}
public class Program
{
public static void Save(string path, Settings s)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Settings));
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
ser.WriteObject(fs, s);
}
}
public static Settings Load(string path)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Settings));
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
return (Settings)ser.ReadObject(fs);
}
}
public static void Main(string[] args)
{
string path = "settings.json";
Save(path, new Settings { Theme = "dark", Notifications = true });
Settings loaded = Load(path);
Console.WriteLine(loaded.Theme + " / " + loaded.Notifications);
}
}
名前付けと簡単な変換
カスタマイズ:
- DataMember の Name= を使用してプロパティ名をマッピングします(例: user_name)
- 列挙型では、値ごとに EnumMember を付けます
- 特殊な形式(日付や数値など)には、C# 6 では文字列プロパティに変換する手動マッピングを使用します
JSON のオプトインルール
まとめ
まとめ: C# 6 では DataContractJsonSerializer を使用し、DataMember でメンバーをオプトインし、Name= で名前を調整して、安全なストリームのパターンで読み書きします。
よくある質問
「System.Text.JsonによるJSON(オプトイン、コンバーター)」レッスンは無料ですか?
はい。「System.Text.JsonによるJSON(オプトイン、コンバーター)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「System.Text.JsonによるJSON(オプトイン、コンバーター)」で何を学びますか?
C# 6に適したJSON処理として、[DataContract]/[DataMember](メンバーのオプトイン)を付けたDataContractJsonSerializerを使い、コンバーターに近い簡単な名前変更を行います。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「System.Text.JsonによるJSON(オプトイン、コンバーター)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- System.IO(パス、ストリーム)
- System.Text.JsonによるJSON(オプトイン、コンバーター)
- シンプルなCSV解析パターン