---
# System prepended metadata

title: System.Text.Json で 非パブリック アクセサー を持つクラスにデシリアライズする方法 C# 2021-06-10
tags: [デシリアライズ, C#, System.Text.Json, 非パブリック アクセサー]

---

---
lang: ja-jp
breaks: true
---
# System.Text.Json で 非パブリック アクセサー を持つクラスにデシリアライズする方法 C# 2021-06-10

> System.Text.Json で変更できない型と非パブリック アクセサーを使用する方法
> https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-immutability?pivots=dotnet-5-0

## コンストラクタに `[JsonConstructor]` を設定し、`JsonSerializerDefaults.Web` を指定すると可能。

```csharp=
public struct Forecast
{
    public DateTime Date { get; }
    public int TemperatureC { get; }
    public string Summary { get; }
 
    [JsonConstructor]
    public Forecast(DateTime date, int temperatureC, string summary) =>
        (Date, TemperatureC, Summary) = (date, temperatureC, summary);
}

public class Program
{
    public static void Main()
    {
        var json = @"{""date"":""2020-09-06T11:31:01.923395-07:00"",""temperatureC"":-1,""summary"":""Cold""} ";
        Console.WriteLine($"Input JSON: {json}");

        var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);

        var forecast = JsonSerializer.Deserialize<Forecast>(json, options);

        Console.WriteLine($"forecast.Date: {forecast.Date}");
        Console.WriteLine($"forecast.TemperatureC: {forecast.TemperatureC}");
        Console.WriteLine($"forecast.Summary: {forecast.Summary}");

        var roundTrippedJson =
                JsonSerializer.Serialize<Forecast>(forecast, options);

        Console.WriteLine($"Output JSON: {roundTrippedJson}");

    }
}
```

:::warning
パラメーター化されたコンストラクターのパラメーター名は、プロパティ名と一致している必要があります。 一致では大文字と小文字は区別されません。また、[JsonPropertyName] を使用してプロパティの名前を変更する場合でも、コンストラクター パラメーターは実際のプロパティ名と一致している必要があります。 
:::

:::info
`[JsonConstructor]`を指定していない場合かつ、デフォルトコンストラクタが`public`である場合は、デフォルトコンストラクタが呼び出される。つまり、正しくデシリアライズされない。
:::

:::info
`JsonSerializerDefaults.General`ではデシリアライズできなかった、必ず、`JsonSerializerDefaults.Web`を指定する必要がある。
:::

:::info
`JsonConstructor`は、`System.Text.Json.Serialization.JsonConstructor` のことである。
:::

###### tags: `System.Text.Json` `非パブリック アクセサー` `デシリアライズ` `C#`
