1

パブリック プロパティを公開しないクラス (AttributeBag) を作成しています。内部には、Get メソッドと Set メソッドを介して管理するオブジェクト (属性) のリストがあります。AttributeBag クラスで JsonSerializer.Serialize() を実行し、以下のような JSON 構造を取得できるようにしたいと考えています。

[
  {
    "Name": "x",
    "Value": "y"
  },
  {
    "Name": "x1",
    "Value": "y1"
  },
  {
    "Name": "x2",
    "Value": "y2"
  }
]

私の Attribute および AttributeBag クラスは次のようになります。

public class Attribute
{
    public string Name { get; set; }
    public object Value { get; set; }
}
public class AttributeBag
{
    private readonly List<Attribute> attributes;

    public AttributeBag()
    {
        this.attributes = new List<Attribute>();
    }

    public AttributeBag Set(string name, object value)
    {
        var searchAttribute = this.attributes.Find(x => x.Name.Equals(name));

        if (searchAttribute != null)
        {
            searchAttribute.Value = value;
        }
        else
        {
            this.attributes.Add(new Attribute { Name = name, Value = value });
        }

        return this;
    }

    public Attribute Get(string name)
    {
        var searchAttribute = this.attributes.Find(x => x.Name.Equals(name));

        if (searchAttribute != null)
        {
            return searchAttribute;
        }
        else
        {
            throw new AttributeNameNotFoundException(name);
        }
    }

    public object GetValue(string name)
    {
        var searchAttribute = this.attributes.Find(x => x.Name.Equals(name));

        if (searchAttribute != null)
        {
            return searchAttribute.Value;
        }
        else
        {
            throw new AttributeNameNotFoundException(name);
        }
    }
}

私は次のような簡単なことをしたいと思っています:

var ab = new AttributeBag();
ab.Set("x", "y");
ab.Set("x1", "y1");
ab.Set("x2", "y2");
string jsonData = JsonSerializer.Serialize(ab);

ドキュメントを見てみましたが、上記の手順を進める方法がわかりません。これには Utf8JsonWriter を使用する必要がありますか? Utf8JsonWriter を使用する場合、JSON 書き込みを実装し、たとえば ab.Serialize() で呼び出す関数が必要であり、JsonSerializer を直接使用する必要はないようです。それは行く方法ですか、それとも JsonSerializer.Serialize を使用する方法はありますか?

どんなポインタでも大歓迎です!

4

2 に答える 2