asp-net core 3.0 的 JsonSerializer 结构

JsonSerializer Struct with asp-net core 3.0

我在将结构转换为 json 时遇到 .net core 3.0 问题。 (当我使用 .net core 2.2 时这不是问题)

这是我的结构

[Serializable]
struct Item
{
   public int A;
   public string B;
   public int C;
   public decimal D;
   public decimal E;
}

这是我的代码

var linhas = COD_PRODUTO.Count;
Item[] item = new Item[linhas];

for (int cont = 0; cont < linhas; cont++)
{
   DESCRICAO = _context.Produtos.Where(c => c.COD_PRODUTO == COD_PRODUTO[cont]).Select(c => 
   c.DESCRICAO).Single().ToString();

   item[cont].A = COD_PRODUTO[cont];
   item[cont].B = DESCRICAO;
   item[cont].C = QUANTIDADE[cont];
   item[cont].D = PRECOUNITARIO[cont];
   item[cont].E = TOTAL[cont];
}

var json = JsonSerializer.Serialize(item); //3.0
Debug.WriteLine("----------------------" + json);

return new JsonResult(json);

它返回空值,有什么帮助吗?

从 3.0 开始,ASP.NET 核心使用 System.Text.Json 到 serialize/deserialize json。 public 属性默认是序列化的。见 official docs:

Serialization behavior

By default, all public properties are serialized.

  1. 要解决该问题,您可以那些public字段更改为public 属性如下:

    [Serializable]
    struct Item
    {
        public int A {get;set;}
        public string B {get;set;}
        public int C {get;set;}
        public decimal D {get;set;}
        public decimal E {get;set;}
    }
    
  2. 或者作为替代方案,您可以按照 the official docs to fallback to the old behavior by using the Newtonsoft.Json 套餐:

    services.AddControllers()
        .AddNewtonsoftJson(opts =>{ /*...*/ });