c# - 为什么 ValueTuple 的返回值为空 JSON?
问题描述
在 .NET 5 中,我创建了一个默认的 webapi 解决方案“WebApplication1”,并且我有一个动作WeatherForecastController
:
[HttpGet]
[Route("[action]")]
public (bool,string) Test()
{
return (true, "have a test!");
}
为什么我总是得到一个空的 JSON {}
?
解决方案
问题是 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});
}
或者您可以选择困难的方式并编写一个将元组键考虑在内的自定义序列化程序。但即使这样也行不通,因为反射信息不包括键。我的猜测是编译器在解析密钥后会丢弃此信息。
推荐阅读
- android - Flutter - 发布版本中的屏幕是灰色的,但从 Android Studio 运行时工作正常
- flutter - Flutter GetX 将数据传到另一个页面
- python - 如何使用 web3 Api Python 获得智能合约的所有权?
- android - MacBook Pro 2021 中的 Android Studio 安装失败
- r - Keras R:在卷积和池化层之后将输入添加到卷积神经网络
- java - Java中的模式编码
- javascript - Javascript确定音乐点在哪一行或几行
- aws-amplify - DuplicateError:重复的文件或模拟。请检查控制台以获取更多信息
- html - Excel VBA - 网页抓取 MSXML2.XMLHTTP 库
- mongodb - 如何在单个请求中合并 3 个 mongoDB 集合或首先进行单个集合以进行电子商务?