【问题标题】:Don't understand how to use JSON.NET with ASP.NET Core WebAPI不明白如何将 JSON.NET 与 ASP.NET Core WebAPI 一起使用
【发布时间】:2017-08-31 19:51:39
【问题描述】:

我已经完成了我的第一个 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 示例)一些大字节数组,我该如何处理结果字符串?它只是“返回 Ok(myJsonString);”吗?内置的序列化器不会再次序列化它吗 - 不知道它已经是序列化操作的结果?

【问题讨论】:

  • 您可以创建自己的IActionResult 派生结果并返回您的序列化内容

标签: json asp.net-web-api asp.net-core asp.net-core-webapi


【解决方案1】:

由于 Asp.Net Core 非常灵活,因此有多种方法可以返回 JSON。如果您想从控制器返回 Json,最直接的方法之一是:

 [HttpGet("/api/data")]
 public JsonResult GetData() {

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

 }

在后台,Controller 上的 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”然后“返回 Ok(anObjectOfTypeJsonResult);”?我对整件事感到非常困惑(我确信这是显而易见的)。
  • 一个 JsonResult 实现了 IActionResult,Jaon 控制器帮助方法返回一个 JsonResult。您可以更改我发布的操作方法以返回 IActionResult,它的效果也一样好。在这种情况下,我更喜欢让 action 方法返回 JsonResult,因为这是该方法将返回的 IActionResult 类型。这有帮助吗?
  • 对不起,罗恩,我还是很困惑。假设我希望传输一个原始字节数组。没有序列化到 JSON、BSON 或其他任何东西……只是一个字节数组。我可以这样做吗?:
  • 当然。如果您愿意,可以使用 Response.WriteAsync 通过其其他方法签名之一发送原始字节。
  • 抱歉,发帖编辑器有问题:[HttpGet("/api/data")] public Byte[] GetData() { return Ok(new Byte[10000]);然后在客户端做: HttpResponseMessage response = httpClient.GetAsyn("/api/data").Result; if(response.IsSuccessStatusCode) { Byte[] someData = response.Content.ReadAsAsync().Result;上面是否涉及任何序列化/反序列化,或者我只是将 bytes[] 数组发送出去?
猜你喜欢
  • 2019-11-02
  • 1970-01-01
  • 2021-12-20
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多