C# でカスタム オブジェクトを Json にシリアル化する方法

okwaves2024-01-25  10

以下のようなクラスがあります

public class CustomObject
{
public string param1;
public IEnumerable<ExampleClass1> param2;
public Dictionary<ExampleClass1, IEnumerable<ExampleClass2>> param3;

//Constructor of the class with values set.
}

public class ExampleClass1
{
    public string example1String;
    public int example1Int;

//Constructor of the class with values set.
}

public class ExampleClass2
{
    public string example2String;
    public int example2Int;

//Constructor of the class with values set.
}

入力:

CustomObject
  param1 : "abc"
  param2 : List<ExampleClass1>
              {abc1,1}
              {abc2,2}
  param3 : Map<ExampleClass1, List<ExampleClass2>>
               <{abc1,1},[{xyz1,2},{xyz2,2}]>
               <{abc2,2},[{xyz3,3},{xyz4,4}]>

出力:

  param1 : "abc"
  param2 :    {abc1,1}
              {abc2,2}
  param3 :<{abc1,1},[{xyz1,2},{xyz2,2}]>

期待される出力

  param1 : "abc"
  param2 :    {abc1,1}
              {abc2,2}
  param3 :{abc1,1},[{xyz1,2},{xyz2,2}]
          {abc2,2},[{xyz3,3},{xyz4,4}]

このクラスをシリアル化したいので、以下のアプローチを使用してオブジェクトを json 文字列にシリアル化します。

var serializedContent = JsonConvert.SerializeObject(CustomObject);

param1 と param2 の出力は正しいですが、param3 は正しくシリアル化されておらず、1 つのレコードしか表示されていません。

どうすればこれを解決できますか? Dictionary をシリアル化できる例を見ましたが、それがクラスのメンバーである場合、クラスの完全なシリアル化を実現するにはどうすればよいですか?

1

何が問題なのかはあまり明確ではありません。入力、得られる出力、および希望する出力を提供していただけますか?または、完全な最小限の再現可能なサンプルを使用することをお勧めします。

– グル・ストロン

2020 年 9 月 3 日 21:26

まず、Object1 インスタンスを意味のある JSON キーとして表すための戦略を決定する必要があります。 JSON キーには文字列または数値を使用できます。

– アルアン・ハダッド

2020 年 9 月 3 日 21:31

データの逆シリアル化に使用するフレームワークによって異なります。さまざまなフレームワーク (newtonsoft.json; System.Text.Json; など) があります。最も気に入ったものを選択してください。

– isxaker

2020 年 9 月 3 日 21:33

@GuruStron が入力と出力を追加しました。

– 新しい発見

2020 年 9 月 3 日 21:44



------------------------

これを特に CustomObject で見てみましょう。

public Dictionary<ExampleClass1, IEnumerable<ExampleClass2>> param3;

クラスをキーとしてマップを設定します。キーがオブジェクトである場合、マップはどのように機能しますか?そうではありません。 「値」を指定する必要があります。そのクラスの。これを簡単に行う方法は、ToString をオーバーライドすることです。

それではこれを試してみてください:

public class ExampleClass1
{
    public string example1String;
    public int example1Int;

    public override string ToString()
    {
        return example1String;
    }
}

ExampleClass1 をキーにする場合は、同じ値を持つ他の ExampleClass1 が存在しないことを確認する必要があることに注意してください。そうしないと、JSON 内にキーが重複して分析が困難になります。

注意: 文字列を ExampleClass1 に変換できないため、これを実際のオブジェクトに逆シリアル化する方法がわかりません。複合 ke を実行する場合は、おそらく何かおかしなことをする必要があるでしょう。y のデータを取得してから、それを逆シリアル化するカスタム JSON コンバータを作成します。

JSON との間でシリアル化する場合は、マップ キーとしてクラスを使用しないことをお勧めします。

ETA: テストに使用したデータ:

var cobj = new CustomObject
{
    param1 = "abc",
    param2 = new ExampleClass1[]
    {
        new ExampleClass1 { example1String = "abc1", example1Int = 1 },
        new ExampleClass1 { example1String = "abc2", example1Int = 2 }
    },
    param3 = new Dictionary<ExampleClass1, IEnumerable<ExampleClass2>>
    {
        { new ExampleClass1{ example1String = "abc1", example1Int = 1 }, new ExampleClass2[] { new ExampleClass2 { example2String = "xyz1", example2Int = 2 }, new ExampleClass2 { example2String = "xyz2", example2Int = 3 } } },
        { new ExampleClass1{ example1String = "abc2", example1Int = 4 }, new ExampleClass2[] { new ExampleClass2 { example2String = "xyz3", example2Int = 5 }, new ExampleClass2 { example2String = "xyz4", example2Int = 6 } } }
    }
};

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。