Chúng tôi đã giải quyết nó bằng cách tạo trình định dạng XML tùy chỉnh.
Đây không phải là giải pháp lý tưởng nhưng nó hoạt động.
Trong Global.asax
GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter());
GlobalConfiguration.Configuration.Formatters
.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Tạo một lớp mới gọi là 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);
});
}
}
}
Nguồn
2013-09-30 01:32:44
Đó là một câu trả lời tuyệt vời. Điều này đảm bảo rằng nếu bạn cũng đang sử dụng bộ chuyển đổi Newtonsoft Json, bạn sẽ luôn luôn kết thúc với cùng một dữ liệu được xuất ra bởi cả hai định dạng - mà không cần phải đánh dấu tất cả các mô hình của bạn. –
Tôi sẽ đề xuất thêm tham số JsonMediaTypeFormatter vào CustomXmlFormatter. Sau đó, khi bạn gọi SerializeObject, vượt qua trong JsonMediaTypeFormatter.SerializerSettings. Điều này sẽ đảm bảo bạn sử dụng cùng một cài đặt để tạo cả JSON và XML. – Brian
Đối với tôi, đây là một giải pháp thực sự thanh lịch cho vấn đề mà @Brian đề cập ở trên: Tôi muốn các tùy chỉnh cài đặt JSON của tôi để chuyển sang loại phương tiện XML; cảm ơn vì đã chia sẻ cách tiếp cận này, @Jakub! FWIW, tôi đã chỉnh sửa câu trả lời với việc triển khai cuối cùng tôi đã kết thúc với các tài khoản đó cho các loại "mảng" và các tài khoản cho khả năng deserialize XML. –