--- 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#`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up