gsh*_*arp 6 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}
}
Run Code Online (Sandbox Code Playgroud)
Microsoft 的序列化程序序列化来自 IName 的属性 JSON.NET 序列化来自 Person 的属性
有没有办法对其进行配置,使其像 JSON.NET 一样工作?我可以传递的选项并不表明这是可配置的。我是不是忽略了什么?
这是因为序列化器使用泛型参数的类型,而不是传递值的类型:
public static string Serialize<TValue>(TValue value, JsonSerializerOptions options = null)
{
return WriteCoreString(value, typeof(TValue), options);
}
Run Code Online (Sandbox Code Playgroud)
这会传递typeof(IName)到WriteCoreString,并最终在该类型上执行反射。
您可以通过将类型显式传递给接受该类型的重载来解决此问题:
var s3 = System.Text.Json.JsonSerializer.Serialize(p, p.GetType());
Run Code Online (Sandbox Code Playgroud)
这将返回:
{"Name":"Waldo","Age":4}
Run Code Online (Sandbox Code Playgroud)
转换为object也有效,因为代码随后调用value.GetType():
var s4 = System.Text.Json.JsonSerializer.Serialize((object)p);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2836 次 |
| 最近记录: |