【问题标题】:Why does JsonSerializer give empty? [duplicate]为什么 JsonSerializer 给空? [复制]
【发布时间】:2020-01-17 16:38:20
【问题描述】:

鉴于这个类,我正在尝试序列化,但它不起作用。

using System.Text.Json;
public class Service
{
    public Service() { }
    public string service;
    public string description;
}

        Service c = new Service();
        c.description = "desc";
        c.service = "serv";
        string x = JsonSerializer.Serialize<Service>(c);

调试我看到 x == "{}"。我错过了什么?

C# .net 核心 3.1

【问题讨论】:

  • 这些是字段,而不是属性。将它们更改为属性。
  • 这里有一些问题。首先,您的班级Service 格式不正确。你需要 getter 和 setter。但第二,这条线:string x = JsonSerializer.Serialize&lt;Service&gt;(c); 对我来说没有意义。序列化时不需要类型。换句话说,你不需要&lt;Service&gt;
  • @CaseyCrookston Serialize 可以采用泛型。您假设这是 JSON.Net 或 .Net 序列化程序。例如,Kentico 有一个serialize method that does take a generic type parameterSystem.Text.Json 序列化程序具有通用重载,但它们采用此处未显示的其他参数。也就是说,你是对的,它不需要指定类型。
  • @Amy,好的,很高兴知道!在发表此评论之前,我查看了JsonSerializer.Serialize 的定义,但没有看到使用类型的选项。
  • @CaseyCrookston 也许模板参数是可选的,但是 MS 提供了那个版本并且为了与 Deserialize 函数对称,为什么不呢?

标签: c# json .net-core system.text.json


【解决方案1】:

你缺少 setter 和 getter

public class Service
{
    public Service() { }
    public string service {get; set;}
    public string description {get; set;}
}

【讨论】:

    【解决方案2】:
    public class Service
    {
        public Service() { }
        public string SomethingElse { get; set; }
        public string Description { get; set; }
    }
    

    关于你的班级的几件事。

    1) 您的属性需要 getter 和 setter(正如其他人指出的那样)

    2) C# 最佳实践是将类属性的第一个字母大写。

    3) 你真的不想使用与类名同名的属性。

    Service c = new Service
    {
        Description = "desc",
        SomethingElse = "serv"
    };
    string x = JsonConvert.SerializeObject(c);
    

    此代码为您提供x

    {"SomethingElse":"serv","Description":"desc"}
    

    请注意,当您创建一个类的新实例并立即将其填充并为属性赋值时,最好使用Object Initializer 方法。

    所以不要这样:

    Service c = new Service();
    c.description = "desc";
    c.service = "serv";
    

    最好这样做:

    Service c = new Service
    {
        Description = "desc",
        SomethingElse = "serv"
    };
    

    【讨论】:

      【解决方案3】:

      这是一个正确的例子:

      using Newtonsoft.Json;
      using System;
      using Microsoft;
      
      public class Program
      {
          public static void Main()
          {
              Service c = new Service();
              c.description = "desc";
              c.service = "serv";
              string json = JsonConvert.SerializeObject(c, Formatting.Indented);
              Console.WriteLine(json);
      
          }
      
          public class Service
          {
              public Service() { }
              public string service;
              public string description;
          }
      
      
      }
      

      【讨论】:

      • Newtonsoft.Json。我想我需要指定我有 System.Text.Json。没有意识到除了默认库之外还存在其他库。
      • @AlanBaljeu 有几个存在。 System.Text.Json 实际上是最年轻的。
      • 年轻 = 新的更好?
      • 我还是更喜欢 Newtonsoft.Json。 CoolLife 在这里所做的只是从JsonSerializer.Serialize 切换到JsonConvert.SerializeObject。我测试了他的代码。它有效。
      • @AlanBaljeu 无论如何更新。 original .Net 序列化器速度很慢,功能也不多,于是制作了Newtonsoft,它是 长期以来的JSON 序列化库。微软向 Newtonsoft 学习并制作了新的 API。我不知道它是否功能丰富。在我看来,Newtonsoft 是一个非常强大的库,而且很难被击败。
      猜你喜欢
      • 2015-02-14
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多