带有JSON字符串的IHttpActionResult

Pat*_*ick 4 c# json json.net

我有一个最初返回的方法,HttpResponseMessage我想将其转换为返回IHttpActionResult.

我的问题是当前的代码是使用JSON.Net来序列化一个复杂的通用树结构,它使用JsonConverter我编写的自定义(代码工作正常)很好.

这是它返回的内容:

    string json = NodeToJson(personNode);

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(json, Encoding.UTF8, "application/json");

    return response;
Run Code Online (Sandbox Code Playgroud)

NodeToJson方法是自定义转换器发挥作用的地方......

private static string NodeToJson(Node<Person> personNode) {

    var settings = new JsonSerializerSettings {
        Converters = new List<JsonConverter> { new OrgChartConverter() },
        Formatting = Formatting.Indented
    };

    return JsonConvert.SerializeObject(personNode, settings);

}
Run Code Online (Sandbox Code Playgroud)

请注意,这将返回a string,格式为JSON.

如果我将其切换到IHttpActionResult,无论我尝试什么,它似乎都会失败.我可以离开它(它有效)但我应该使用最佳实践,IHttpActionResult似乎是我应该使用的.

我试过return Json(json);但这会导致无效的,不可解析的JSON,大概是因为它试图进行双重转换?

return Ok(json); 导致JSON字符串被包装在XML中.

这样做的正确方法是什么?

编辑:

我已经成功地将此项目中的每个方法转换为使用IHttpActionResult,除了这个特殊的方法.

它是JSON的通用树的序列化.无论我尝试什么方法,我都会找回无效的JSON.该HttpResponseMsessage方法工作正常,但我无法获得有效的JSON IHttpActionResult.

小智 10

您可以创建自己的IHttpActionResult类实例以返回JSON以及控制器或基本控制器类中的方法以使用它.

创建设置内容和状态代码的IHttpActionResult实例:

public class JsonTextActionResult : IHttpActionResult
{
    public HttpRequestMessage Request { get; }

    public string JsonText { get; }

    public JsonTextActionResult(HttpRequestMessage request, string jsonText)
    {
        Request = request;
        JsonText = jsonText;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(Execute());
    }

    public HttpResponseMessage Execute()
    {
        var response = this.Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(JsonText, Encoding.UTF8, "application/json");

        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

向控制器添加方法以创建结果.这是一个Web API示例:

public class MyApiController : ApiController
{
    protected internal virtual JsonTextActionResult JsonText(string jsonText)
    {
        return new JsonTextActionResult(Request, jsonText);
    }

    [HttpGet]
    public IHttpActionResult GetJson()
    {
        string json = GetSomeJsonText();
        return JsonText(json);
    }
}
Run Code Online (Sandbox Code Playgroud)


You*_*jae 5

另一个建议如下。

var json = JToken.FromObject(yourObject);
return Ok(json);
Run Code Online (Sandbox Code Playgroud)


小智 2

我遇到了同样的问题,这段代码对我有用(使用 Newtonsoft.Json nuget 包反序列化 json):

var unserializedContent = JsonConvert.DeserializeObject(json);
return Json(unserializedContent);
Run Code Online (Sandbox Code Playgroud)

看来我们必须有一个对象才能让 Json() 正常工作。

  • 您正在反序列化 json 字符串并在发送之前再次序列化。这将影响应用程序的性能和可扩展性。\ (4认同)