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 laMyClass
? - 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.
Vous devez vous connecter pour publier un commentaire.
Cela devrait faire l'affaire:
De la sérialisation:
En appelant
expected.ToArray()
vous êtes à la sérialisation d'un groupe deKeyValuePair<MyClass, object>
objets plutôt que de les dictionnaire.Désérialisation:
Ici vous désérialiser le tableau et ensuite récupérer le dictionnaire avec
.ToDictionary(...)
appel.Je ne suis pas sûr si le résultat répond à vos attentes, mais sûrement, il passe à l'assertion d'égalité.
Grx70 la réponse est bonne, juste en ajoutant une solution de rechange ici. J'ai rencontré ce problème dans un projet d'API Web où je n'étais pas à l'appel de
SerializeObject
mais permettant la sérialisation pour arriver automatiquement.Cette coutume
JsonConverter
basé sur Brian Rogers en réponse à une question similaire a fait le tour pour moi:Dans mon cas, j'ai été sérialisation d'une
Dictionary<MyCustomType, int>
de la propriété à une classe oùMyCustomType
a des propriétés commeName
etId
. C'est le résultat: