.NetFrameworkの機能でJSONをパース

System.Runtime.Serialization.Jsonを使用する。

  • JSON to DataContractクラスはMSからコンバートツールが出ていない
  • JSON to DataContractクラス生成はWEBベースなら下記サイトでできる。
    痒い所に手が届かないのでここで作ったのを成型すると良いかも。
    http://jsontodatacontract.azurewebsites.net/
  • DataMemberがJSONに存在しない時はデシリアライズでnullになる

FileConfig.cs

    [DataContract]
    public partial class FileConfig
    {
        [DataMember]
        public string file_name;

        [DataMember]
        public string copyright;

        [DataMember]
        public string[] include_files;

        [DataMember]
        public string @namespace;

        [DataMember]
        public string[] definitions;
    }

 

Program.cs

            StreamReader sr =
                new StreamReader(@"D:\prj\software\codegeneration\JsonResource\Resources\GpuEnum\FileConfig.json");

            var serializer = new DataContractJsonSerializer(typeof(FileConfig));

            var deserialized = (FileConfig)serializer.ReadObject(sr.BaseStream);

            sr.Close();

参考:https://dev.classmethod.jp/etc/c-sharp-json/

JSONの命名規則

msのサンプルが参考になる。

参考:https://docs.microsoft.com/en-us/bingmaps/rest-services/json-data-contracts

DataContractJsonSerializerの挙動を変える

DataContractクラスでOnDeserializedMethod()等をオーバーライドする。JSONのある要素の値位しか取れないので大したことはできない。デシリアライズ時に値がパスであればそのパスをオープンして情報を取得するという事をやりたかったのだが…。

参考:https://docs.microsoft.com/en-us/dotnet/standard/serialization/custom-serialization