バックグラウンド
Json.NET とデフォルトの .NET JavaScriptSerializer はどちらも、 のインスタンスをIHtmlString
プロパティのないオブジェクトとして扱い、空のオブジェクトにシリアル化します。なんで?これは、メソッドが 1 つしかないインターフェイスであり、メソッドが 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 リポジトリにアクセスしてください。