2013-09-25 2 views
0

Je vois XmlException se produire à partir de la sortie chaque fois que le fichier JSON désérialisé contient des caractères tels que '@'. En fin de compte, il le désérialise toujours avec succès, mais cela ne me permet pas de savoir ce qui ne va pas. Il ralentit également beaucoup le débogage car beaucoup de réponses json contais ces caractères.Caractères spéciaux, XmlException et DataContractJsonSerializer

Code pour reproduire:

public static class JsonHelper 
{  
    public static T Deserialize<T>(string json) 
    { 
     var obj = Activator.CreateInstance<T>(); 
     using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
     { 
      var serializer = new DataContractJsonSerializer(obj.GetType()); 
      obj = (T)serializer.ReadObject(ms); 
     } 
     return obj; 
    } 
} 

[DataContract] 
class JsonObject 
{ 
    [DataMember(Name = "@name")] 
    public string Name { get; set; } 
} 


public partial class MainPage : PhoneApplicationPage 
{ 
    private static string json = "{\"@name\":\"Something\"}"; 

    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 

     var obj = JsonHelper.Deserialize<JsonObject>(json); 
     // obj.Name now contains "Something" as it should, but an XmlException has also happened. 
    } 

Une exception de type 'System.Xml.XmlException' a eu lieu dans System.Xml.ni.dll et n'a pas été traitée avant une frontière gérée/native

Ai-je raté quelque chose? Je ne voudrais pas faire de recherche & remplacer avant de désérialiser, si possible.

Modifier

Si je lance le même code dans une application console .NET 4.5, je ne vois pas cette exception qui se passe.

Répondre

0

Pouvez-vous essayer d'encapsuler l'appel à JsonHelper.Deserialize ... dans une tentative de catch et de vérifier l'innerexception pour voir s'il y a plus de détails. En outre, vous pouvez essayer de définir l'accesseur de votre classe JsonObject sur public et voir si cela aide.

+0

Merci pour la réponse. Le réglage de l'accesseur n'a aucun effet, juste raté quand j'ai construit un simple repro à partir du soluton réel. Et l'exception, il est pris quelque part dans le DataContractJsonSerializer et je ne peux pas me retenir. –

0

Commencé en utilisant json.NET qui n'a aucun problème à gérer ce genre de réponses.