7

System.Text.Json読み取り専用プロパティに保存されているコレクションを逆シリアル化するための新しいものを取得するのに問題があります。

次のクラスを検討してください。

public class SomeItem {
    public string Label { get; set; }
}

public class SomeObjectWithItems {

    public string Label { get; set; }

    // Note this property is read-only but the collection it points to is read/write
    public ObservableCollection<SomeItem> Items { get; }
        = new ObservableCollection<SomeItem>();
}

JSONは次のとおりです。

{
  "Label": "First Set",
  "Items": [
    {
      "Label": "Item 1"
    },
    {
      "Label": "Item 2"
    },
    {
      "Label": "Item 3"
    },
    {
      "Label": "Item 4"
    }
  ]
}

これが私が実行しているコードです...

var json = ...;
var obj = JsonSerializer.deserialize<SomeObjectWithItems>(json);
Debug.WriteLine($"Item Count for '{obj.label}': {obj.Items.Count}");  

上記の出力は次のとおりです。

Item Count for 'First Set': 0

読み取り/書き込みに変更Itemsすると機能しますが、私たちのモデルの多くには、変更可能なコレクションを保持する読み取り専用のプロパティがあるため、これを使用できるかどうか疑問に思っています。

注: Json.NET はこれを正しく処理し、新しいコレクションを作成するのではなく、既存のコレクションで 'Add' メソッドを内部的に呼び出しますが、定義したすべてのクラスのカスタム コンバーターを作成する以外にそれを達成する方法がわかりません。

4

1 に答える 1