Json.NET 辞書 StringComparerシリアル化で質問する

Json.NET 辞書 StringComparerシリアル化で質問する

辞書 がありますDictionary<string, Dictionary<string, object>>。外側の辞書と内側の辞書の両方に等価比較子が設定されています (私の場合は ですStringComparer.OrdinalIgnoreCase)。辞書がシリアル化および逆シリアル化された後、両方の辞書の比較子は に設定されませんStringComparer.OrdinalIgnoreCase

コード内で辞書の作成を制御できる場合は、辞書から継承したクラスを作成し、クラスのデフォルト コンストラクターで comparer を設定できます。しかし、辞書の作成を制御できず、他のコードから辞書を取得する場合はどうなるでしょうか。

比較子を使用して正しくシリアル化/逆シリアル化する方法はありますか?

ベストアンサー1

Dictionary<string, string>1 つの簡単なアイデアとしては、比較子をデフォルトで に設定するのサブクラスを作成しStringComparer.OrdinalIgnoreCase、通常の辞書の代わりにそのサブクラスに逆シリアル化することが挙げられます。例:

class CaseInsensitiveDictionary<V> : Dictionary<string, V>
{
    public CaseInsensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""Foo"" : 
            {
                ""fiZZ"" : 1,
                ""BUzz"" : ""yo""
            },
            ""BAR"" :
            {
                ""dIt"" : 3.14,
                ""DaH"" : true
            }
        }";

        var dict = JsonConvert.DeserializeObject<CaseInsensitiveDictionary<CaseInsensitiveDictionary<object>>>(json);

        Console.WriteLine(dict["foo"]["fizz"]);
        Console.WriteLine(dict["foo"]["buzz"]);
        Console.WriteLine(dict["bar"]["dit"]);
        Console.WriteLine(dict["bar"]["dah"]);
    }
}

出力:

1
yo
3.14
True

おすすめ記事