2015-09-17 1 views
4

J'ai une méthode comme celle-ci.DataContractJsonSerializer et JsonConvert donnent des résultats différents

using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    DataContractJsonSerializer dataContractSerializer = new DataContractJsonSerializer(typeof(Message), this.knowTypes); 
    dataContractSerializer.WriteObject(memoryStream, message); 

    byte[] byteArray = memoryStream.ToArray(); 
    memoryStream.Close(); 
    return byteArray; 
} 

Quand je convertir la chaîne à byteArray le résultat est comme ci-dessous: {"__type":"Login:#Project.ProjectName.Sockets","Password":"F9AAD6B7CFBD2A756101","Username":"UserName"}

Ce résultat est significatif mon serveur.

Cependant, je veux changer ce code en raison de certains problèmes de caractères.

byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)); 
return byteArray; 

Maintenant je convertir byteArray à chaîne le résultat comme: {"Username":"UserName","Password":"F9AAD6B7CFBD2A756101"}

Aussi j'ai essayé d'utiliser JsonSerializerSettings

settings = new JsonSerializerSettings(); 
settings.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full; 
settings.TypeNameHandling = TypeNameHandling.Objects; 

et le résultat est {"$type":"Project.ProjectName.Sockets.Login, ProjectName","Username":"UserName","Password":"F9AAD6B7CFBD2A756101"}

Quelle est la différence entre DataContractJsonSerializer et JsonConvert et il est po ssible d'obtenir le même résultat en utilisant JsonConvert.

+0

Est-il possible de changer à la fois sérialisation et à la fin désérialisation avec 'Json.NET'? –

+0

Le format des indications de type de Json.NET est codé en dur. Voir [Format de 'Special Property' ($ type) est codé en dur] (https://json.codeplex.com/workitem/22429). – dbc

+0

Possible dupliquer? [JSON.Net - Modifier le champ $ type à un autre nom?] (Http://stackoverflow.com/questions/9490345/json-net-change-type-field-to-another-name). – dbc

Répondre

0

passer les paramètres suivants au DataContractJsonSerializer et vous ne devriez jamais obtenir aucune information de type:

DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings() 
{ 
    EmitTypeInformation = EmitTypeInformation.Never 
}; 
+2

Je pense que l'OP veut émettre des informations de type, juste dans une structure différente. –

+0

DataContractJsonSerializerSettings est pour .Net 4.5 et versions ultérieures. Aussi j'ai oublié de dire que j'utilise silverlight 5 donc je ne peux pas utiliser 'DataContractJsonSerializerSettings' – Blast