【问题标题】:Can I deserialize Json with private constructor using System.Text.Json?我可以使用 System.Text.Json 使用私有构造函数反序列化 Json 吗?
【发布时间】:2021-07-13 22:58:45
【问题描述】:

想知道是否可能拥有私有构造函数并使用新的 System.Text.Json 序列化程序。

public class MyModel
{
    public string Name { get; set; }
    public string Data { get; set; }

    private MyModel() 
    {
        // use me for when deserializing
    }

    public MyModel(string name, string data)
    {
        Name = name;
        Data = data;
    }
}

简单的往返。

var model = new MyModel("doo", "doo");
var json = JsonSerializer.Serialize(model, new JsonSerializerOptions
{
    WriteIndented = true
});

// no to go because of there is no parameterless constructor defined for this object.
var rehydrated = JsonSerializer.Deserialize<MyModel>(json);

【问题讨论】:

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


【解决方案1】:

它会显示为the answer is "No," or at least, "Not Yet"

这是 [System.Text.Json] v1 的 System.Text.Json 序列化程序的已知限制。我们计划在未来支持这一点。 -ashonkhan

您可以为此编写custom converter...对于[ASP.NET Core] 3.0 版本,没有计划在反序列化期间调用非默认构造函数的额外支持。这必须由自定义转换器完成。 -史蒂夫哈特

链接的自定义转换器选项允许您使用 必须构建对象的任何 API,但与 Newtonsoft.Json 或 Entity Framework 可以执行的操作不同摆弄反射和私有构造函数,所以可能不是你想要的。

【讨论】:

  • 有没有为所有构造函数都是私有的类实现自定义转换器的示例?
【解决方案2】:

【讨论】:

  • JsonConstructor 属性不适用于私有构造函数,仅当您有多个公共构造函数并希望指定其中一个进行反序列化时才有效。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2019-07-12
  • 2021-12-08
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多