2010-12-30 22 views
42

DataContractJsonSerializer non è in grado di serializzare correttamente i dizionari.Un modo per rendere DataContractJsonSerializer serializzare correttamente i dizionari?

Mentre JavaScriptSerializer serializza dizionari come {"abc":"xyz","def":42} per esempio, il DataContractJsonSerializer dà [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}] invece.

Questo è veramente problematico e voglio sapere come posso serializzare correttamente gli oggetti del dizionario nel mio servizio WCF. Sto cercando una soluzione che richieda un minimo sforzo.

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

Questa è la soluzione che finalmente usato per serilize dizionari correttamente in WCF: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/765f1569-0422-4471-8ec2-1d03b2026771

+1

Se non si utilizza Json.NET, vedere questo: http://stackoverflow.com/questions/7498208/serialize-dictionarytkey-tvalue-to-json-with-datacontractjsonserializer – mehmettkocc

risposta

43

Utilizzando DataContractJsonSerializerSettings (disponibile dal .NET 4.5) può fare questo per voi:

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

Salve, dove posso sostituire il serializzatore "normale" con questo serializier quando creo l'host di servizio nel codice? – flayn

8

Anche se questa volontà nella maggior parte dei casi causare una riscrittura e quindi non essere fattibile si può lasciare che la tua interfaccia servizio WCF accettare e tornare Stream nel qual caso si può prendere il pieno controllo di serializzazione. In questo modo è possibile utilizzare JavaScriptSerializer, JSON.NET o ServiceStack.JSON per eseguire la serializzazione effettiva e questi serializzatori effettivamente gestiscono i dizionari in modo più ragionevole.

+0

Forse intendevi stringa invece di flusso? –

+3

@Markus: No, non l'ho fatto. Una stringa non ti dà il controllo sulla serializzazione, dà al metodo una firma forzando un qualche tipo di input, mentre 'Stream' per convenzione indica WCF che vuoi prendere il controllo sulla serializzazione. Non penso che queste due soluzioni siano intercambiabili. – faester

+0

Hmm ... ho pensato che anche un tipo di stringa di restituzione non sarebbe stato elaborato, il che non sembra essere il caso? Altrimenti, usando lo stream anziché la stringa, sarebbe ingombrante, IMO. –

3

DataContractJsonSerializerSettings ha la proprietà UseSimpleDictionaryFormat e serializza i dizionari nel modo previsto.

+1

Dove posso sostituire il serializzatore "normale" con questo serializier quando sto creando l'host di servizio nel codice? – flayn

Problemi correlati