haru and...

猫のようにだらけ、犬のように遊ぶ。

【MVC】【C#】Dictionaryのキーが文字列・オブジェクト以外のデータはJsonでリターンできない

表題の通りキーが文字列・オブジェクト以外のデータをJsonでリターンしようとすると
下記のようなサーバエラー500が返ってくる。

型 'System.Collections.Generic.Dictionary`略' は辞書のシリアル化/逆シリアル化に対してサポートされていません。キーは文字列またはオブジェクトである必要があります。




例えば下記のようにキーが列挙型の場合リターンしようとするとエラーとなる。

【モデル】

public class AnPanModel
{
    public enum AnpanFamily
    { 
        AnpanMen = 0,
        JamOjiSaaan,
        BatacoSaaan,
        Cheeeeez,
        ByKynMen,
        DQNChaan
    }

    public class CharacterStatus
    {
        public CharacterStatus(int id, string waza, int damage)
        {
            this.ID = id;
            this.HissatsuWaza = waza;
            this.Damage = damage;
        }
        public int ID { get; set; }
        public string HissatsuWaza { get; set; }
        public int Damage { get; set; }
    }
    public Dictionary<AnpanFamily, CharacterStatus> CharacterData { get; set; } 
}


【コントローラ】

public ActionResult GetAnPanData(Models.AnPanModel model)
{
    model.CharacterData = new Dictionary<Models.AnPanModel.AnpanFamily, Models.AnPanModel.CharacterStatus>();

    model.CharacterData.Add(Models.AnPanModel.AnpanFamily.AnpanMen, 
            new Models.AnPanModel.CharacterStatus(1, "あんぱんち", 9999));

    return Json(model);
}



回避するにはエラーに返ってきているように、キーを文字列かオブジェクトにしてしまう
【モデル】

public class AnPanModel
{
    public enum AnpanFamily
    { 
        AnpanMen = 0,
        JamOjiSaaan,
        BatacoSaaan,
        Cheeeeez,
        ByKynMen,
        DQNChaan
    }

    public class CharacterStatus
    {
        public CharacterStatus(int id, string waza, int damage)
        {
            this.ID = id;
            this.HissatsuWaza = waza;
            this.Damage = damage;
        }
        public int ID { get; set; }
        public string HissatsuWaza { get; set; }
        public int Damage { get; set; }
    }
    public Dictionary<string, CharacterStatus> CharacterData { get; set; } 
}


【コントローラ】

public ActionResult GetAnPanData(Models.AnPanModel model)
{
    model.CharacterData = new Dictionary<string, Models.AnPanModel.CharacterStatus>();

    model.CharacterData.Add(Models.AnPanModel.AnpanFamily.AnpanMen.ToString(), 
            new Models.AnPanModel.CharacterStatus(1, "あんぱんち", 9999));

    return Json(model);
}



もう一つ、回避策としては、リターンデータを一度「JsonConvert.SerializeObject」で
Json文字列にしてしまって「return Content」で文字列としてコントローラからリターン。

JavaScript側でJSON.parse()するという方法もある。