System.Text.Json中等效的JsonProperty属性是什么?

52
2个回答

80

9

注意,如果有人在寻找用System.Text.Json替换Newtonsoft并尝试序列化一个 私有的 属性,请注意:Newtonsoft可以使用Newtonsoft.Json.JsonProperty属性来序列化私有属性,但是在私有属性上使用System.Text.Json.Serialization.JsonPropertyName则不起作用。例如:

enum Animal { Cat, Dog }
class Foo
{
    [Newtonsoft.Json.JsonProperty("animals")]
    [System.Text.Json.Serialization.JsonPropertyName("animals")]
    private string AnimalForSerializer
    {
        get => AnimalForMe.ToString() + "s";
        set => AnimalForMe = Enum.Parse<Animal>(value.TrimEnd('s'));
    }
 
    [System.Text.Json.Serialization.JsonIgnore]
    [Newtonsoft.Json.JsonIgnore]
    public Animal AnimalForMe { get; set; }
}

var b = new Foo { AnimalForMe = Animal.Dog };

var json = System.Text.Json.JsonSerializer.Serialize(b);
var fromJson = System.Text.Json.JsonSerializer.Deserialize<Foo>(json);
Console.WriteLine($"{json} -> {fromJson.AnimalForMe}");

json = Newtonsoft.Json.JsonConvert.SerializeObject(b);
fromJson = Newtonsoft.Json.JsonConvert.DeserializeObject<Foo>(json);
Console.WriteLine($"{json} -> {fromJson.AnimalForMe}");

输出

{} -> Cat
{"animals":"Dogs"} -> Dog

为了替换此行为,您需要使用JsonInclude。或者更确切地说,几乎可以替换。 System.Text.Json 团队决定不支持私有属性。如果您尝试这样做,将会收到类似于“在类型 'Foo' 上非公共属性 'AnimalForSerializer' 带有无效的 'JsonIncludeAttribute' 注释。”的错误信息。但是,您可以拥有一个私有 Setter,显然:

class Foo
{
    [Newtonsoft.Json.JsonProperty("animals")]
    [System.Text.Json.Serialization.JsonInclude]
    [System.Text.Json.Serialization.JsonPropertyName("animals")]
    public string AnimalForSerializer
    {
        get => AnimalForMe.ToString() + "s";
        private set => AnimalForMe = Enum.Parse<Animal>(value.TrimEnd('s'));
    }
    
    [System.Text.Json.Serialization.JsonIgnore]
    [Newtonsoft.Json.JsonIgnore]
    public Animal AnimalForMe { get; set; }
}

var b = new Foo { AnimalForMe = Animal.Dog };

var json = System.Text.Json.JsonSerializer.Serialize(b);
var fromJson = System.Text.Json.JsonSerializer.Deserialize<Foo>(json);
Console.WriteLine($"{json} -> {fromJson.AnimalForMe}");

json = Newtonsoft.Json.JsonConvert.SerializeObject(b);
fromJson = Newtonsoft.Json.JsonConvert.DeserializeObject<Foo>(json);
Console.WriteLine($"{json} -> {fromJson.AnimalForMe}");

输出

{"animals":"Dogs"} -> Dog
{"animals":"Dogs"} -> Dog

当然,没有 private 会破坏封装性,但你该怎么办。


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