0Pricing
C# Academy · レッスン

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 のオプトインルール

確認問題: DataContractJsonSerializer で、特定のプロパティだけを 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. System.IO(パス、ストリーム)
  2. System.Text.JsonによるJSON(オプトイン、コンバーター)
  3. シンプルなCSV解析パターン
← C# Academyに戻る