Une façon de rendre DataContractJsonSerializer sérialiser correctement les dictionnaires?

DataContractJsonSerializer ne peut pas sérialiser correctement les dictionnaires.

Alors que JavaScriptSerializer sérialise Dictionnaires comme {"abc":"xyz","def":42} par exemple, le DataContractJsonSerializer donne [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}] place.

C’est vraiment problématique et je veux savoir comment sérialiser correctement les objects Dictionnaire dans mon service WCF. Je cherche une solution qui nécessite le moins d’efforts.

ref: http://msdn.microsoft.com/en-us/library/bb412170.aspx

Il s’agit de la solution de contournement que j’ai finalement utilisée pour sériliser correctement les dictionnaires dans WCF: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/765f1569-0422-4471-8ec2-1d03b2026771

Utiliser DataContractJsonSerializerSettings (disponible depuis .NET 4.5) peut le faire pour vous:

 var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings() { UseSimpleDictionaryFormat = true }); 

Malheureusement, cela semble être une conception différée, conformément à la section “Collections, dictionnaires et tableaux” à l’ adresse http://msdn.microsoft.com/en-us/library/bb412170.aspx.

Toutes les collections, dictionnaires et tableaux sont représentés sous forme de tableaux dans JSON .

Bien que cela entraîne dans la plupart des cas une réécriture majeure et donc irréalisable, vous pouvez laisser votre interface de service WCF accepter et renvoyer Stream auquel cas vous pouvez prendre le contrôle total de la sérialisation. De cette façon, vous pouvez utiliser JavaScriptSerializer , JSON.NET ou ServiceStack.JSON pour effectuer la sérialisation proprement dite et ces sérialiseurs traitent en fait de manière plus rationnelle les dictionnaires.

DataContractJsonSerializerSettings a maintenant la propriété UseSimpleDictionaryFormat et sérialise les dictionnaires comme vous le souhaitez.