2009-05-10 5 views
1

je la fonction suivante:JSON.Net: Convertir chaîne JSON de chaîne XML à l'instance numéro

public static T GetInstance<T>(string xmlString) 
{ 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(new StringReader(xmlString)); 
    string jsonString = JsonConvert.SerializeXmlNode(xmlDoc.DocumentElement); 
    T instance = JsonConvert.DeserializeObject(jsonString, typeof(T)) as T; 
    return instance; 
} 

Il fonctionne très bien pour les chaînes XML normales. Cependant, si la chaîne XML d'entrée contient des commentaires tels que:

.... 
<!-- some comments ... 
--> 
.... 

l'appel de fonction JsonConvert.DeserializeObject() lancera une exception:

Newtonsoft.Json.JsonSerializationException was unhandled 
Message="Unexpected token when deserializing object: Comment" 
Source="Newtonsoft.Json" 
StackTrace: 
    at Newtonsoft.Json.JsonSerializer.PopulateObject(Object newObject, JsonReader reader, Type objectType) 
    .... 

Soit je dois couper tous les commentaires dans la chaîne XML, ou si je peux utiliser les paramètres d'option dans JsonConvert pour ignorer les commentaires.

Pour la première option, si je dois supprimer tous les commentaires à l'aide de XmlDocument, existe-t-il des options dans XmlDocument disponibles pour convertir une chaîne XML en chaîne XML réservée aux nœuds?

Pour la deuxième option, je préfère, s'il y a une option dans Json.Net pour ignorer les commentaires lors de la désialisation de l'objet?

+0

Opps Je ne pensais pas de commentaires. Je vais ajouter un support pour les gérer dans la prochaine version de Json.NET. –

Répondre

3

Je pense que la meilleure façon pour moi maintenant est de supprimer d'abord tous les nœuds de commentaire de la chaîne xml.

public static string RemoveComments(
     string xmlString, 
     int indention) 
{ 
    XmlDocument xDoc = new XmlDocument(); 
    xDoc.PreserveWhitespace = false; 
    xDoc.LoadXml(xmlString); 
    XmlNodeList list = xDoc.SelectNodes("//comment()"); 

    foreach (XmlNode node in list) 
    { 
     node.ParentNode.RemoveChild(node); 
    } 

    string xml; 
    using (StringWriter sw = new StringWriter()) 
    { 
     using (XmlTextWriter xtw = new XmlTextWriter(sw)) 
     { 
     if (indention > 0) 
     { 
      xtw.IndentChar = ' '; 
      xtw.Indentation = indention; 
      xtw.Formatting = System.Xml.Formatting.Indented; 
     } 

     xDoc.WriteContentTo(xtw); 
     xtw.Close(); 
     sw.Close(); 
     } 
     xml = sw.ToString(); 
    } 

    return xml; 
    } 

Et ceci est ma fonction pour obtenir par exemple de chaîne xml:

public static T GetInstance<T>(string xmlString) 
{ 
    srring xml = RemoveComments(xmlString); 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(new StringReader(xml)); 
    string jsonString = JsonConvert.SerializeXmlNode(xmlDoc.DocumentElement); 
    T instance = JsonConvert.DeserializeObject(jsonString, typeof(T)) as T; 
    return instance; 
} 
Questions connexes