2013-09-23 11 views
6

Piszę usługę sieci Web API, która zwraca dynamicznie skonstruowaną torbę własności. Czy istnieje jakiś działający serializator lub sposób przekształcania dynamicznego na XML? Próbowałem szukać dobrych propozycji, ale nie znalazłem niczego użytecznego.Web API - serializacja dynamiczna do XML

Odpowiedz

18

Rozwiązaliśmy to, tworząc niestandardowy formatator XML.

To nie jest idealne rozwiązanie, ale działa.

W Global.asax

GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter()); 
GlobalConfiguration.Configuration.Formatters 
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

Utwórz nową klasę o nazwie CustomXmlFormatter

using System; 
using System.IO; 
using System.Net.Http.Formatting; 
using System.Net.Http.Headers; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 

namespace EMP.WebServices.api.Formatters 
{ 
    public class CustomXmlFormatter : MediaTypeFormatter 
    { 
     public CustomXmlFormatter() 
     { 
      SupportedMediaTypes.Add(
       new MediaTypeHeaderValue("application/xml")); 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml")); 
     } 

     public override bool CanReadType(Type type) 
     { 
      if (type == (Type)null) 
       throw new ArgumentNullException("type"); 

      return true; 
     } 

     public override bool CanWriteType(Type type) 
     { 
      return true; 
     } 

     public override Task WriteToStreamAsync(Type type, object value, 
      Stream writeStream, System.Net.Http.HttpContent content, 
      System.Net.TransportContext transportContext) 
     { 
      return Task.Factory.StartNew(() => 
       { 
         var json = JsonConvert.SerializeObject(value); 

         var xml = JsonConvert 
          .DeserializeXmlNode("{\"Root\":" + json + "}", ""); 

         xml.Save(writeStream); 
       }); 
     } 
    } 
} 
+3

to fantastyczne rozwiązanie. Gwarantuje to, że jeśli korzystasz również z konwertera Jets Newtonsoft, zawsze kończysz z tymi samymi danymi, które są wyprowadzane przez oba formaty - bez konieczności zaznaczania wszystkich modeli. –

+1

Proponuję dodanie parametru JsonMediaTypeFormatter do CustomXmlFormatter. Następnie, gdy wywołasz SerializeObject, przekaż JsonMediaTypeFormatter.SerializerSettings. Dzięki temu będziesz używać tych samych ustawień do tworzenia zarówno JSON, jak i XML. – Brian

+0

Dla mnie jest to naprawdę eleganckie rozwiązanie tego problemu, o którym wspomina powyższy @Brian: chciałem, aby moje ustawienia JSON dostosowały się do typu mediów XML; dziękuję za podzielenie się tym podejściem, @Jakub! FWIW, zredagowałem odpowiedź z implementacją, którą ostatecznie zakończyłem z kontami typu "array" i kontami z możliwością deserializacji XML. –