首页 > 解决方案 > 为什么 ValueTuple 的返回值为空 JSON?

问题描述

在 .NET 5 中,我创建了一个默认的 webapi 解决方案“WebApplication1”,并且我有一个动作WeatherForecastController

        [HttpGet]
        [Route("[action]")]
        public (bool,string) Test()
        {
            return (true, "have a test!");
        }

为什么我总是得到一个空的 JSON {}

标签: c#asp.net-coreasp.net-core-webapivalue-type

解决方案


问题是 ASP.NET CoreSystem.Text.Json用于序列化。但它不能处理(命名的)元组:

var result = (Message: "hello", Success: true);
var json = JsonSerializer.Serialize(result);
Console.WriteLine(json);

这将输出一个空对象{}

Json.NET 可以序列化它,但需要注意的是:它不保留元组键。

var result = (Message: "hello", Success: true);
var json = JsonConvert.SerializeObject(result);
Console.WriteLine(json);

这输出:

{"Item1":"hello","Item2":true}

因此,如果要保留密钥,最简单的选择是使用包装类:

public class Result<T>
{
    public T Data { get; set; }
    public bool Success { get; set; }
}

[HttpGet]
public async Task<ActionResult<Result<string>>> Hello(CancellationToken cancellationToken)
{
    // ...
    return Ok(new Result<string>{Data = "hello", Success = true});
}

或者您可以选择困难的方式并编写一个将元组键考虑在内的自定义序列化程序。但即使这样也行不通,因为反射信息不包括键。我的猜测是编译器在解析密钥后会丢弃此信息。


推荐阅读