6
我正在編寫一個Web API Web服務,它正在返回動態構建的屬性包。有沒有工作的序列化程序或如何將動態序列化到XML?我試圖尋找任何好的建議,但沒有發現任何可用的東西。Web API - 動態到XML序列化
我正在編寫一個Web API Web服務,它正在返回動態構建的屬性包。有沒有工作的序列化程序或如何將動態序列化到XML?我試圖尋找任何好的建議,但沒有發現任何可用的東西。Web API - 動態到XML序列化
我們通過創建自定義XML格式化程序來解決它。
這不是一個理想的解決方案,但它的工作原理。
在Global.asax
GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter());
GlobalConfiguration.Configuration.Formatters
.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
創建一個名爲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);
});
}
}
}
新類這是一個夢幻般的答案。這保證瞭如果您還使用Newtonsoft Json轉換器,您將始終用兩種格式輸出相同的數據 - 而不必標記所有模型。 –
我建議添加一個JsonMediaTypeFormatter參數給CustomXmlFormatter。然後當你調用SerializeObject時,傳進JsonMediaTypeFormatter.SerializerSettings。這將確保您使用相同的設置來創建JSON和XML。 – Brian
對於我來說,這是@Brian上面提到的問題的一個非常優雅的解決方案:我想讓我的JSON設置自定義轉換爲XML媒體類型;感謝分享這個方法,@Jakub! FWIW,我編輯了實現的答案,最終我以「數組」類型的帳戶結束了帳戶,並說明了對XML進行反序列化的能力。 –