不理解如何在ASP.NET Core WebAPI中使用JSON.NET

4

我已经完成了我的第一个ASP.NET Core Web API,我想尝试使用JSON.NET库手动序列化/反序列化JSON数据。在JSON.NET文档中,他们提供了以下简单的手动序列化示例:

public static string ToJson(this Person p)
{
    StringWriter sw = new StringWriter();
    JsonTextWriter writer = new JsonTextWriter(sw);

    writer.WriteStartObject();

    // "name" : "Jerry"
    writer.WritePropertyName("name");
    writer.WriteValue(p.Name);

    // "likes": ["Comedy", "Superman"]
    writer.WritePropertyName("likes");
    writer.WriteStartArray();
    foreach (string like in p.Likes)
    {
        writer.WriteValue(like);
    }
    writer.WriteEndArray();

    writer.WriteEndObject();

    return sw.ToString();

作为一个初学者,我觉得缺少的是如何使用这个字符串。例如,考虑以下内容:

[HttpGet("/api/data")
[Produces("application/json")]
public IActionResult GetData()
{
    return Ok(new Byte[SomeBigInt]);
}

在上面的代码中,我不知道ASP.NET Core将数组序列化为JSON的具体位置...我假设它是在幕后的某个地方发生的。如果我手动序列化(使用JSON.NET示例)一些大型字节数组,那么我该怎么处理生成的字符串?只需要"return Ok(myJsonString);"吗?内置的序列化器会不会再次对其进行序列化,因为它不知道它已经是一个序列化操作的结果?

你可以创建自己的 IActionResult 派生结果,其中返回序列化内容。 - Nkosi
1个回答

1
由于Asp.Net Core非常灵活,有多种返回JSON的方式。如果您想从控制器返回Json,其中最直接的方法之一是这样做:
 [HttpGet("/api/data")]
 public JsonResult GetData() {

     return Json(new {
        fieldOneString = "some value",
        fieldTwoInt= 2
     });

 }

在幕后,控制器上的Json()帮助方法使用JSON.NET进行JSON序列化,然后将其作为响应正文发送。您可以像这样执行相同的操作:
 string jsonText = JsonConvert.SerializeObject(new {
        fieldOneString = "some value",
        fieldTwoInt= 2
     });

 Response.WriteAsync(jsonText);

注意:要使用Response.WriteAsync(jsonText),您需要在文件中添加using Microsoft.AspNetCore.Http并具有对Microsoft.AspNetCore.Http.Abstractions的项目引用。

一个JsonResult实现了IActionResult接口,而Json控制器辅助方法返回一个JsonResult。您可以更改我发布的操作方法以返回IActionResult,它将同样有效。但在这种情况下,我更喜欢让操作方法返回JsonResult,因为这是该方法即将返回的IActionResult类型。这有帮助吗? - RonC
抱歉Ron,我还是很困惑。假设我想传输一个原始的字节数组。不需要序列化为JSON、BSON或其他任何格式...只是一个字节数组。我能做到这点吗? - LKeene
由于Ron提到了“Response.WriteAsync”,我找到了这个: - LKeene
http://stackoverflow.com/questions/21347877/transferring-raw-bytes-over-http-using-the-asp-net-webapi-2 - LKeene
如果您发送原始字节,则不会进行任何额外的序列化。即使通过WriteAsync发送原始字符串,实际上也没有任何序列化,将发送字符串的UTF8字节。 - RonC
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接