这里说的是字典的键值是自定义类的情况,其他情况不在讨论范围,所使用的Newtonsoft.Json.dll会在结尾给出下载地址。

    闲话少说,直接上代码。

using System;
using System.Collections.Generic;

namespace Test
{
    class KeyClass
    {
        public int value;

        public KeyClass(int value)
        {
            this.value = value;
        }

        public static explicit operator KeyClass(string jsonString)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject<KeyClass>(jsonString);
        }

        public override string ToString()
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(this);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            TestDictionaryJson();
        }
        
        static public void TestDictionaryJson()
        {
            Dictionary<KeyClass, List<KeyClass>> dic = new Dictionary<KeyClass, List<KeyClass>>();
            KeyClass key1 = new KeyClass(1);
            List<KeyClass> value1 = new List<KeyClass>();
            value1.AddRange(new KeyClass[] { new KeyClass(111), new KeyClass(112), new KeyClass(113) });
            KeyClass key2 = new KeyClass(2);
            List<KeyClass> value2 = new List<KeyClass>();
            value2.AddRange(new KeyClass[] { new KeyClass(211), new KeyClass(212), new KeyClass(213) });

            dic.Add(key1, value1);
            dic.Add(key2, value2);

            string str = Newtonsoft.Json.JsonConvert.SerializeObject(dic);

            var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<KeyClass, List<KeyClass>>>(str);
        }
    }
}

    其中重要的是:

public static explicit operator KeyClass(string jsonString)
{
    return Newtonsoft.Json.JsonConvert.DeserializeObject<KeyClass>(jsonString);
}

public override string ToString()
{
    return Newtonsoft.Json.JsonConvert.SerializeObject(this);
}

    说明:Newtonsoft.Json.dll中有许多东西,但本人对它并不熟悉;到目前为止,针对此文所讨论的情况,使用它的普通序列化和反序列化是有问题的,但并不排除通过其他的用法是完全可以胜任的;以上是我总结出的一套方法,欢迎各位看官指点其他更为有效的方法。 

    dll下载地址:https://github.com/JamesNK/Newtonsoft.Json