【发布时间】:2022-03-09 03:36:26
【问题描述】:
我想从作为反序列化目标的类中导入 json 数据。 System.Text.Json 是否可以在没有额外映射的情况下实现这一点?理想情况下,我会使用“this”而不是泛型类型参数。我知道这是不可能的,但有类似的选择吗?这是我的有效测试代码,因为它创建数据对象只是为了将其映射到属性。理想情况下,我不需要两次实例化“测试”。
public class Test
{
public string? Bar { get; set; }
public void ImportJson(string payload)
{
var data = System.Text.Json.JsonSerializer.Deserialize<Test>(payload);
Bar = data?.Bar; // Don't want to map
}
}
string foo = "{ \"Bar\": \"baz\" }";
var t = new Test();
t.ImportJson(foo);
Console.WriteLine(t.Bar);
【问题讨论】:
-
不,这是不可能的。
Deserialize只能创建新实例,没有可以填充现有实例的重载。因此,提供ImportJson作为实例方法几乎没有意义,只需将其设为static Test FromJson(string payload)或类似方法即可。 (当然,当您拥有它时,它只是Deserialize的一个微不足道的包装器,因此可能没有添加任何值。) -
您正在寻找
Populate()方法,但与Newtonsoft 不同的是,有no such method built in to System.Text.Json。请参阅:.Net Core 3.0 JsonSerializer populate existing object。事实上,这看起来是重复的,同意吗? -
同意,这个问题是重复的,我没有发现它缺少知道Json.net“Populate()”方法。
标签: c# json json-deserialization system.text.json