ぽんこつプログラマーの日々のまとめ
serializeallthethings


Newtonsoft Json.Net
を利用して Json形式にSerializeする際、デフォルトではメンバーのクラス名は出力されない。そのため下記のような構造を出力すると上手くDeserialize出来ない。
 class A {
    public List<B> bs;
  }

  class B {
    public int hoge { get; set; }
  }

  class C : B {
    public int fuga { get; set; }
  }

  class json {
    public static void exp() {
      var a1 = new A() { bs = new List<b>()  };
      for (int i = 0; i < 5; i++) {
        if (i % 2 == 0)
          a1.bs.Add(new B() { hoge = i });
        else
          a1.bs.Add(new C() { hoge = i, fuga = i * 10 });
      }
      // シリアライズ
      var str = JsonConvert.SerializeObject(a1);
      // デシリアライズ
      var a2 = JsonConvert.DeserializeObject<A>(str);
      foreach (var item in a2.bs ) {
        Console.WriteLine(item.GetType().ToString());
      }
      /*
       * 結果
       * namespace.B
       * namespace.B
       * namespace.B
       * namespace.B
       * namespace.B
       * 
       * 本当は
       * namespace.B
       * namespace.C
       * namespace.B
       * namespace.C
       * namespace.B
       * となってほしい
       */
       */
    }
  }


この場合シリアライズオプションを設定し、クラス名を明示的に出力することで解決する。
      // 設定
var setting = new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.All
};
// シリアライズ
var str = JsonConvert.SerializeObject(a1, setting); // デシリアライズ var a2 = JsonConvert.DeserializeObject<A>(str, setting); foreach (var item in a2.bs ) { Console.WriteLine(item.GetType().ToString()); } /* * 結果 * namespace.B * namespace.C * namespace.B * namespace.C * namespace.B */
以上自分用メモ。

Add Comments

名前
 
  絵文字
 
 
webmaster

Redmusk

最西端の地で釣りとギターとゲームをこよなく愛する本業ぽんこつプログラマー。今を生きるを座右の銘とし日々快楽だけを求め切磋琢磨しております。

soundcloud