背景
Json.NET 和默认的 .NET JavaScriptSerializer 都会将 的实例IHtmlString
视为没有属性的对象,并将其序列化为空对象。为什么?因为它是一个只有一个方法的接口,并且方法不会序列化为 JSON。
public interface IHtmlString {
string ToHtmlString();
}
解决方案
对于 Json.NET,您需要创建一个自定义JsonConverter
来使用IHtmlString
并输出原始字符串。
public class IHtmlStringConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(Type objectType) {
return typeof(IHtmlString).IsAssignableFrom(objectType);
}
public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {
IHtmlString source = value as IHtmlString;
if (source == null) {
return;
}
writer.WriteValue(source.ToString());
}
public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {
// warning, not thoroughly tested
var html = reader.Value as string;
return html == null ? null : System.Web.Mvc.MvcHtmlString.Create(html);
}
}
有了它,将你的 new 实例发送IHtmlStringConverter
到 Json.NET 的SerializeObject
调用。
string json = JsonConvert.SerializeObject(objectWithAnIHtmlString, new[] { new IHtmlStringConverter() });
示例代码
对于一个控制器演示的示例 MVC 项目,请访问此问题的 GitHub 存储库。