为什么 JsonSerializer 返回空值?

6

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

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 core 3.1


4
那些是字段,不是属性。将它们改为属性。 - madreflection
@CaseyCrookston Serialize可以使用泛型。您假设这是JSON.Net或.Net序列化程序。例如,Kentico有一个serialize方法,它确实需要一个泛型类型参数System.Text.Json序列化程序具有泛型重载,但它们需要其他未在此处看到的参数。话虽如此,您是正确的,不需要指定类型。 - user47589
@Amy,好的,知道了!在发表这个评论之前,我查看了JsonSerializer.Serialize的定义,并没有看到使用类型的选项。 - Casey Crookston
@CaseyCrookston 或许模板参数是可选的,但微软提供了这个版本,为了与反序列化函数对称,为什么不使用呢? - Alan Baljeu
@CaseyCrookston 你可以在MSDN上找到它们[https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializer.serialize?view=netcore-3.1]。第三个和第四个重载是通用的。但正如我所说,它们需要多个参数。 - user47589
显示剩余2条评论
3个回答

10
您缺少设置器(setter)和获取器(getter)。
public class Service
{
    public Service() { }
    public string service {get; set;}
    public string description {get; set;}
}

3
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"
};

0

这是一个正确的例子:

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。没有意识到除了默认库之外还存在其他库。 - Alan Baljeu
@AlanBaljeu 有几个可选的库。System.Text.Json 实际上是其中最年轻的一个。 - user47589
年轻 = 新的和更好的? - Alan Baljeu
我仍然更喜欢Newtonsoft.Json。CoolLife在这里所做的只是从JsonSerializer.Serialize切换到JsonConvert.SerializeObject。我测试了他的代码。它可以工作。 - Casey Crookston
@AlanBaljeu 新的 .Net 序列化器比原来的要好。原始的 .Net 序列化器速度较慢,功能也不够强大,因此诞生了 Newtonsoft,长期以来一直是 the JSON 序列化库。Microsoft 从 Newtonsoft 中学到了很多,并制作了新的 API。我不知道它是否同样富有特色。在我看来,Newtonsoft 是一个非常强大的库,很难被超越。 - user47589
@AlanBaljeu Kentico和Unity都有自己的JSON序列化工具,但它们不像其他通用工具那样强大,也不是非常健壮。 - user47589

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接