はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】System.Text.Jsonで[JsonRequired]を用いて、デシリアライズの際にプロパティが存在しないとJsonExceptionを投げさせる

はじめに

今回はSystem.Text.Json[JsonRequired]について書きたいと思います。

www.nuget.org

learn.microsoft.com

前提

System.Text.Jsonでデシリアライズする際に、[JsonRequired]が付与されていないプロパティに対してはjsonに値がなくてもエラーが吐かれることはなく、デフォルト値が代入されます。

public class Program
{
    public static void Main(string[] args)
    {
        var json = "{ }"u8;

        // 別にエラーになるわけではないので注意
        var hoge = JsonSerializer.Deserialize<Hoge>(json);
        if (hoge == null) throw new Exception();
        
        // 0
        Console.WriteLine(hoge.Num);
        
        // True
        Console.WriteLine(hoge.Num2 == null);
        
        // True
        Console.WriteLine(hoge.Text == null);

        // Text2
        Console.WriteLine(hoge.Text2);
    }
}

public class Hoge
{
    // デフォルト値 : 0
    public int Num { get; init; }
    
    // デフォルト値 : null
    public int? Num2 { get; init; }
    
    // デフォルト値 : null
    public string Text { get; init; }
    
    // jsonに値がないと Text2 になる
    public string Text2 { get; init; } = "Text2";
}

[JsonRequired]について

[JsonRequired]を付与することで、デシリアライズするさいにプロパティが存在しないとJsonExceptionを投げるようにすることができます。

public class Program
{
    public static void Main(string[] args)
    {
        var json = "{ \"Num\" : 10 }"u8;

        // Numがない場合 : Unhandled exception. System.Text.Json.JsonException: JSON deserialization for type 'Sample.Hoge' was missing required properties, including the following: Num
        var hoge = JsonSerializer.Deserialize<Hoge>(json);
        if (hoge == null) throw new Exception();
        
        // 10
        Console.WriteLine(hoge.Num);
        
        // True
        Console.WriteLine(hoge.Num2 == null);
        
        // True
        Console.WriteLine(hoge.Text == null);

        // Text2
        Console.WriteLine(hoge.Text2);
    }
}

public class Hoge
{
    // 必ずNumがないとJsonExceptionがなげられる
    [JsonRequired]
    public int Num { get; init; }
    
    // [JsonRequired]が付与されていなければ必須ではない
    // デフォルト値 : null
    public int? Num2 { get; init; }
    
    // デフォルト値 : null
    public string Text { get; init; }
    
    // jsonに値がないと Text2 になる
    public string Text2 { get; init; } = "Text2";
}