コード
using System.Text.Json;
using System.Text.Json.Serialization;

var r0 = new MyData() 
{
	c1 = "ABC",
	c2 = new MyData2()
	{
		c3 = 123,
	},
}
var jso = new JsonSerializerOptions ();
jso.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
var r0s = JsonSerializer.Serialize ( r0, jso );
var r0d = JsonSerializer.Deserialize<mydata?> ( r0s );

Json
object 形式をテキスト表現するフォーマットの一つ。
codedescription
{}object 単位を示す
[]リスト構造を示す
:key = value の区切り記号

{
	"c1":"ABC",
	"c2":
	{
		"c3":123
	}
}

変換表
jsonC# code
{
  "c1":"123",
  "c2":123
}
//key=valueの関係
class obj1
{
  public string c1 {get;set;} = "123";
  public int c2 {get;set;} = 123;
}
{
  "c1":
  {
    "c1":"2026-01-10T16:22:53.0920467+09:00"
  }
}
//object in object
class obj1
{
  public obj2 c1 {get;set;} = new obj2();
}
public class obj2
{
  public DateTime c1 {get;set;} = DateTune.Now;
}
{
  "c1":["A1","A2","A3"],
  "c2":[123,456,789],
  "c3":{"1":"A1","2":"A2"},
}
//list value
class obj1
{
  public List<string> c1 { get; set; } = new List<string> () { "A1","A2","A3", };
  public int[] c2 { get; set; } = new[] { 123, 456, 789 };
  public Dictionary<int, string> c3 { get; set; } = new Dictionary<int, string> () { { 1, "A1" }, { 2, "A2" } };
{
  "c1":
  {
    "1":["C1","C2","C3"],"2":["D1","D2","D3"]
  }
}
//dictionary + list
class obj1
{
  public Dictionary<int, List<string>> c1 { get; set; } = new Dictionary<int, List<string>> () { 
    { 1, new List<string> {"C1","C2","C3"} },
    { 2, new List<string> {"D1","D2","D3"} } };
}
{
  "c5":
  {
    "c1":[["A1","A2","A3"],["B1","B2","B3"]],
    "c2":[["A1","A2","A3"],["B1","B2","B3"]]
  }
}
object 
class obj1
{
	public object c1 { get; set; } = new obj2 ();
}
public class obj2
{
  public List<List<string>> c1{ get; set; } = new List<List<string>> (){new List<string>{"A1", "A2", "A3", },new List<string>{"B1", "B2", "B3", }};
  public List<string[]> c2{ get; set; } = new List<string[]>(){new []{"A1","A2","A3"},new []{"B1","B2", "B3"}};
}
{
  "\u30C6\u30B9\u30C8\u5217":"\u3042\u3044\u3046\u3048\u304A"
}
//これを変換するには以下のコードで Un Escape する。
Regex.Unescape ( text );
//日本語。
class obj1
{
  [JsonPropertyName("テスト列")]
  public object c1 { get; set; } = "あいうえお";
}
Regex.Unescape ( text );
//Unescapeの結果。
{
  "c1":
  {
    "テスト列":"あいうえお"
  }
}
//JsonElement
class obj1
{
  public object c1 { get; set; } = JsonElement.Parse ( "{\"テスト列\":\"あいうえお\"}" );
}

JsonSerializerOptions
propertydescription
AllowTrailingCommas(false)末尾にカンマを付与するかどうか
Encoder文字エスケープしない範囲を指定する
JavaScriptEncoder.Createで除外するunicodeの範囲を指定する
DefaultIgnoreCondition(never)JsonIgnoreAttributeの参照を指定する
0: IgnoreNullValuesを参照
1: Always 常に無視
2:WhenWritingDefault 規定値の場合に無視
3:WhenWritingNull nullの場合に無視
IgnoreNullValues(false)obsolete.
IncludeFields(field)fieldも入出力の対象
IndentCharacter(whitespace)インデントする時の文字
WriteIndented=trueの場合に有効
IndentSize(2)インデント文字数

JsonElement
var obj1 = JsonElement.Parse ( "{\"C1\":\"ABC\",\"C2\":123,\"列3\":\"あいう\"}" );
//
var zzz = obj1.EnumerateObject ();
foreach( var zz in zzz )
{
	Console.WriteLine ( $"{zz.Name}={zz.Value}" );
}
//
var xxx = obj1.GetProperty ( "列3" );
var xx = xxx.GetString ();
Console.WriteLine ( $"[{obj2.GetPropertyCount()}] {xxx.ValueKind} ==> {xxx.GetString ()}");
//
C1=ABC
C2=123
列3=あいう
[3] String ==> あいう

@see
C#, JSON形式でのシリアライズ
JavaScript, 配列型のJSON
MySQL, Json型の取り出し