JsonSerializer结构与asp-net core 3.0

gab*_*ira 4 serialization json struct 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码

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);

Run Code Online (Sandbox Code Playgroud)

它返回我空值,有帮助吗?

itm*_*nus 5

从 3.0 开始,ASP.NET Core 使用System.Text.Json来序列化/反序列化 json。并且公共属性默认是序列化的。请参阅官方文档

序列化行为

默认情况下,所有公共属性都会被序列化。

  1. 要解决该问题,您可以将这些公共字段更改为公共属性,如下所示:

    [可序列化]
    结构项
    {
        公共 int A {get;set;}
        公共字符串 B {get;set;}
        公共 int C {get;set;}
        公共小数 D {get;set;}
        公共小数 E {get;set;}
    }
    
  2. 或者作为替代方案,您可以按照官方文档使用Newtonsoft.Json包回退到旧行为:

    [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;}
    }