読者です 読者をやめる 読者になる 読者になる

デンターの雑記帳

アニメ、電子工作、ソフトウェアなど

C#でJSONにシリアライズするときに引っかかったこと

超スロー更新だけど雑記帳だからいいよね()
C#JSONでデータを保存しようと思いデータコントラクトを作るまではよかったのですが
このコントラクトをデシリアライズするときに少してこずってしまったのでメモしておこうと思います。
具体的には一つのデータコントラクトを配列にしたJSONをデシリアライズするときの話

  [DataContract]
        public class RegiPros
        {

            [DataMember]
            public string Url;
            [DataMember]
            public string Title;
            [DataMember]
            public string Personality;
            [DataMember]
            public string Content;
            [DataMember]
            public int Weekday;
            [DataMember]
            public int Rec_time;
            [DataMember]
            public int Recordingtime;
            [DataMember]
            public int Id;
            [DataMember]
            public bool Do_rec;
        }

というデータコントラクトを用意した。当初RegiProsの配列を用意し、配列をDataContractJsonSerializerでWriteObjectすればいいだろうと思っていました。
実際に行うとルートが複数あることになるんです。xmlだったら問題はなかったんでしょうがJSONだとデシリアライズするときにやり方がわからず思考停止

ツイッターで嘆いていたらフォロワーさんからアドバイスをいただき、回避?できました。
回避方法はいたって単純でクラスの中にクラスを作りそれをリストとすることでルートを一つにするだけでした。以下が変更後の内容です

[DataContract]
    public class RegiPro_json
    {

        [DataMember]
        public List<RegiPros> regiPros { get; set; }

        [DataContract]
        public class RegiPros
        {

            [DataMember]
            public string Url;
            [DataMember]
            public string Title;
            [DataMember]
            public string Personality;
            [DataMember]
            public string Content;
            [DataMember]
            public int Weekday;
            [DataMember]
            public int Rec_time;
            [DataMember]
            public int Recordingtime;
            [DataMember]
            public int Id;
            [DataMember]
            public bool Do_rec;
        }
    }

なぜ、この発想が出てこなかったのか…
ともあれ、残しておきますね。

ところで、データコントラクトへの格納はクラス、リスト、コントラクト宣言してリストにクラスを追加、コントラクトのフィールドに代入でいいんですかね。
(なげぇ)