Comment puis-je sérialiser/désérialiser un dictionnaire personnalisé à l'aide des touches Json.Net?

J'ai la classe suivante, que j'utilise comme une clé dans un dictionnaire:

    public class MyClass
    {
        private readonly string _property;

        public MyClass(string property)
        {
            _property = property;
        }

        public string Property
        {
            get { return _property; }
        }

        public override bool Equals(object obj)
        {
            MyClass other = obj as MyClass;
            if (other == null) return false;
            return _property == other._property;
        }

        public override int GetHashCode()
        {
            return _property.GetHashCode();
        }
    }

Le test, je suis en cours d'exécution est ici:

    [Test]
    public void SerializeDictionaryWithCustomKeys()
    {
        IDictionary<MyClass, object> expected = new Dictionary<MyClass, object>();
        expected.Add(new MyClass("sth"), 5.2);
        JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
        string output = JsonConvert.SerializeObject(expected, Formatting.Indented, jsonSerializerSettings);
        var actual = JsonConvert.DeserializeObject<IDictionary<MyClass, object>>(output, jsonSerializerSettings);
        CollectionAssert.AreEqual(expected, actual);
    }

Le test échoue, parce que Json.Net semble être à l'aide de la ToString() méthode sur le dictionnaire clés, au lieu de la sérialisation d'eux correctement. Le résultant json à partir du test ci-dessus est:

{
  "$type": "System.Collections.Generic.Dictionary`2[[RiskAnalytics.UnitTests.API.TestMarketContainerSerialisation+MyClass, RiskAnalytics.UnitTests],[System.Object, mscorlib]], mscorlib",
  "RiskAnalytics.UnitTests.API.TestMarketContainerSerialisation+MyClass": 5.2
}

qui est manifestement erronée. Comment puis-je le faire fonctionner?

  • JSON n'est pas toujours manipuler les dictionnaires très bien, pourquoi ne pas simplement remplacer .ToString() de la MyClass?
  • Pourquoi un tel complexe de clé de dictionnaire? Pourquoi ne pas avoir le dictionnaire de la valeur à l'intérieur de votre classe, puis remplacez le dictionnaire avec une liste?
  • Pourriez-vous préciser quel est le résultat attendu devrait ressembler? Parce que je suis assez sûr que l'attribut complexe noms ne font pas partie de JSON...
  • dans le code réel, il existe différents types de clés. J'ai pu mettre en œuvre ToString() et d'un convertisseur de type sur chacun d'eux, mais j'espérais que le sérialiseur ferait ce travail pour moi...
  • parce que mon type n'a pas un type de coverter de chaîne, je m'attendais à obtenir une liste de paires clé-valeur.
  • pourquoi n'êtes-vous pas en spécifiant le [Serializable] l'attribut de la classe?
  • Json.NET les poignées de la sérialisation des dictionnaires assez bien, et il n'y a pas besoin de marquer une classe sérialisable.
  • apparemment pas.
  • Mon expérience avec la sérialisation JSON à l'aide de dictionnaires n'a pas été bon non plus.

InformationsquelleAutor Grzenio | 2014-07-10