带有JSON字符串的IHttpActionResult

zujrkrfu  于 2023-06-25  发布在  其他
关注(0)|答案(9)|浏览(147)

我有一个最初返回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;

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);

}

注意,这将返回一个string,格式为JSON。
如果我将其切换到IHttpActionResult,无论我尝试什么,它似乎都会失败。我可以离开它(它工作),但我应该使用最佳实践,这和IHttpActionResult似乎是我应该使用的。
我试过return Json(json);,但这导致无效的,不可解析的JSON,大概是因为它试图做双重转换?
return Ok(json);导致JSON字符串被 Package 在XML中。
什么是正确的方法来做到这一点?

编辑:

我已经成功地将这个项目中的每个方法都转换为使用IHttpActionResult,除了这个特定的方法。
这是一个通用树到JSON的序列化。不管我尝试什么方法,我都得到了无效的JSON。HttpResponseMsessage方法工作得很好,但我无法用IHttpActionResult获取有效的JSON。

fsi0uk1n

fsi0uk1n1#

您可以创建自己的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;
    }
}

向控制器中添加一个方法以创建结果。下面是一个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);
    }
}
at0kjp5o

at0kjp5o2#

另一项建议如下:

var json = JToken.FromObject(yourObject);
return Ok(json);
zpqajqem

zpqajqem3#

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

var unserializedContent = JsonConvert.DeserializeObject(json);
return Json(unserializedContent);

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

v8wbuo2f

v8wbuo2f4#

这里的一些解决方案是将string转换为JSON,这不是必需的。你只是在白白地使用计算机资源。

// Instead of 
//    return Ok(jsonstring);
// do:
      HttpResponseMessage response = this.Request.CreateResponse(HttpStatusCode.OK);
      response.Content = new StringContent(jsonstring, Encoding.UTF8, "application/json");
      Request.RegisterForDispose(response); //To avoid the Pragma CA2000 warning
      return ResponseMessage(response);

客户端另一种解决方案

您可以做一个小的更改,以准备接收字符串并在必要时转换它。下面的代码是JavaScript

var data;
    if (typeof weapiresponse == "string")
        data = JSON.parse(weapiresponse);
    else
        data = weapiresponse;
yrdbyhpb

yrdbyhpb5#

如果你不打算使用XML作为返回类型,你也可以在WebApiConfig中删除XmlFormatter:

config.Formatters.Remove(config.Formatters.XmlFormatter);
lpwwtiir

lpwwtiir6#

正确的方法是返回:Ok(json);
它将结果转换为XML,因为这是默认的接受返回类型。尝试添加:Accept: application/json到你的API请求头,我认为这应该解决这个问题。

bqucvtff

bqucvtff7#

我在使用XML标记返回JSON字符串时遇到了同样的问题。我尝试了所有简单的解决方案,比如:
return Json(text),json反序列化并添加config.Formatter for json,但这并没有帮助。我在json对象周围得到了两个cote,或者它是畸形的。
只有TGRA编写的解决方案对我有效。
创建自己的IHttpActionResult类示例以返回JSON

mklgxw1f

mklgxw1f8#

对我来说,返回IHttpActionResult的唯一方法是下面的Json字符串内容。

[HttpGet]
public IHttpActionResult ReturnStringAsJson()
{
    return this.ResponseMessage(new HttpResponseMessage
    {
        Content = new StringContent("[json string]"), 
        Encoding.UTF8, 
        "application/json"), 
    });
}
qmb5sa22

qmb5sa229#

对于IActionResult来说,这是一个非常简单的方法,几乎不使用任何资源:

public async Task<IActionResult> WantJson()
    {
        var jsonString = JsonSerializer.Serialize(GetYourObjectHere());
        return Content(jsonString, "application/json");
    }

相关问题