c# - 当将特定类转换为其他类时,JsonSerializer 的行为不符合预期

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

我试图从 json.net 迁移到微软的 json 并发现一些行为非常不同。

让我们使用这个简化的例子:

public interface IName
{
    string Name { get; set; }

}

public class Person : IName
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public void Foo() 
{
   IName p = new Person {Age = 4, Name = "Waldo"};
   var s1 = System.Text.Json.JsonSerializer.Serialize(p); // --> {"Name":"Waldo"}
   var s2 = Newtonsoft.Json.JsonConvert.SerializeObject(p); // --> {"Name":"Waldo","Age":4}
}

Microsoft 的序列化程序从 IName 序列化属性 JSON.NET 序列化来自 Person 的属性

有没有办法配置它,使其像 JSON.NET 一样工作?我可以传递的选项并不表示这是可配置的。我忽略了什么吗?

最佳答案

这是因为序列化器uses the type of the generic parameter ,不是传递值的类型:

public static string Serialize<TValue>(TValue value, JsonSerializerOptions options = null)
{
    return WriteCoreString(value, typeof(TValue), options);
}

这会将 typeof(IName) 传递给 WriteCoreString,并最终在该类型上执行反射。

您可以通过 explicitly passing the type 解决此问题到接受那个的重载:

var s3 = System.Text.Json.JsonSerializer.Serialize(p, p.GetType());

返回:

{"Name":"Waldo","Age":4}

转换为 object 也可以,因为代码 then calls value.GetType() :

var s4 = System.Text.Json.JsonSerializer.Serialize((object)p);

关于c# - 当将特定类转换为其他类时,JsonSerializer 的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429098/

相关文章:

c# - 跨平台的Sqlite

c# - 使用 Json.net 编写 JSON 时如何打开缩进?

c# - 使用 Server.Transfer 传递参数但不使用查询字符串

c# - 序列化到现有文件并删除声明

android - 有没有办法从 Google Play 上的开发者那里获取所有应用程序

python - 使用 BeautifulSoup 解析 JSON 文件

c# - 如何从存储在 CouchDB 中的 Serilog 中反序列化 LogEvents

c# - 尝试将具有空属性名称的 JSON 转换为 XML 时出现异常

c# - 调用 API Controller 的 delete 方法不起作用

ios - Swift Codable - 如何编码自定义数组