2

カスタムActionResult(簡略化)を作成しました:

public class FastJSONResult : ActionResult
{
    public string JsonData { get; private set; }

    public FastJSONResult(object data)
    {
        JsonData = JSON.Instance.ToJSON(data);
    }

    public override void ExecuteResult(ControllerContext context)
    {
        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = "application/json";
        response.Output.Write(JsonData);
    }
}

そして、私の WebApi コントローラーから使用します。

public ActionResult GetReport()
{
   var report = new Report();
   return new FastJSONResult(report);
}

問題は、FastJSONResultコンストラクターでオブジェクトが完全にシリアル化され、ExecuteResult呼び出されず、応答して次のようなオブジェクトになるという事実にもかかわらずです。

{"JsonData":"{my json object as a string value}"}

私は何を間違っていますか?

4

1 に答える 1

1

Solved it with custom formatter (simplified to post less code)

public class FastJsonFormatter : MediaTypeFormatter
{
  private static JSONParameters _parameters = new JSONParameters()
  {
    public FastJsonFormatter()
    {
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
      SupportedEncodings.Add(new UTF8Encoding(false, true));
    }

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

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

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        var task = Task<object>.Factory.StartNew(() => JSON.Instance.ToObject(new StreamReader(readStream).ReadToEnd(), type));
        return task;
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
      var task = Task.Factory.StartNew(() =>
      {
         var json = JSON.Instance.ToJSON(value, _parameters);
         using (var w = new StreamWriter(writeStream)) w.Write(json);  
      });
      return task;
    }
}

In WebApiConfig.Register method:

config.Formatters.Remove(config.Formatters.JsonFormatter);
config.Formatters.Add(new FastJsonFormatter());

And now I receive json object properly: Sample

于 2013-10-11T15:14:28.077 に答える