[C#] System.Text.Json の Serialize で JSON が空になる
現象
Xamarin の開発で System.Text.Json でシリアライズしようとしたときの話です。
Data という Json への変換を想定したモデルがあるとします。(名前は説明用の仮のものです)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Data { [JsonPropertyName("id")] internal int Id { get; set; } [JsonPropertyName("name")] internal string Name { get; set; } [JsonPropertyName("message"), JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] internal string Message { get; set; } } |
このクラスを以下のように Serialize しても中身が空になってしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System.Text.Json; ... var data = new Data(); data.Id = 1; data.Name = "データ1"; data.Message = "こんにちは"; // シリアライズ(オブジェクトをJSONにする) var jsonText = JsonSerializer.Serialize(data); // "{}" と出力される Debug.WriteLine(jsonText); |
JsonSerializerOptions などのせいかと思い、いろいろ試しましたが、結果的にはオプションは関係ありませんでした。
解決
以下のように シリアライズ対象のプロパティは public に したところシリアライズした Json が取得できるようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Data { [JsonPropertyName("id")] public int Id { get; set; } [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("message"), JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string Message { get; set; } } |
public にしないとシリアライズされないというのは公式のドキュメントにも特に記載は無いようです。
internal にしてもビルドエラーにはならないので、なかなか気づきにくいところです。
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。