【问题标题】:How to Return a struct as json with .NetCore如何使用 .Net Core 将结构返回为 json
【发布时间】:2021-12-01 05:55:04
【问题描述】:

我正在将 .Net Framework WebAPI 迁移到 .Net Core。使用 Framework(特别是使用 Newtonsoft.Json),根据 Accept 标头将类或结构作为 xml 或 json 返回。

使用 .Net Core,结构总是以空 json 的形式返回:例如[{},{}].

从一个精简的新项目(即 WeatherController)开始,我如何让它正确序列化并返回非空 json?

public struct MyStructure
{
    public double A;
    public double B;
}
    
[ApiController]
[Route("[controller]")]
public class MyStructureController : ControllerBase
{
    [HttpGet]
    public IEnumerable<MyStructure> Get()
    {
        return new List<MyStructure>
        {
            new MyStructure(){A = 1.2d, B = 5.6d},
            new MyStructure(){A = 2.2d, B = 3.3d},
        };
    }
}
//desired response:  [{"X":1.2,"Y":5.6},{"X":2.2,"Y":3.3}]

我在supportedunsupported 序列化文档中找不到我需要的东西,但我显然忽略了一些东西!

【问题讨论】:

    标签: c# json asp.net-core-webapi


    【解决方案1】:

    不要让实例变量尝试使用 getter 和 setter 方法将它们更改为属性。

    public struct MyStructure
    {
        public double A {get;set;}
        public double B {get;set;}
    }
    

    这将帮助您获得所需的响应

     [{"X":1.2,"Y":5.6},{"X":2.2,"Y":3.3}]
    

    【讨论】:

      【解决方案2】:

      您需要在您的JsonSerializerOptions 中设置IncludeFields = true - 与class 相同fields)。或查看answer below(回复:propeties

      【讨论】:

      • 是的!这无需修改结构即可工作,因此被接受。 services.AddControllers() .AddJsonOptions(options =&gt;{options.JsonSerializerOptions.IncludeFields = true;});
      【解决方案3】:

      尝试使用公共属性而不是公共变量。我认为 system.text.json 默认只序列化公共属性

      【讨论】:

      • 仅供参考 - 字段可以序列化 (IncludeFields = true)
      • 是的,这行得通:public double A { get; set; }
      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2016-02-05
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      相关资源
      最近更新 更多