如何使用 System.Text.Json 忽略常量属性的 JSON 序列化?

Ber*_*kal 6 c# json json.net system.text.json

我正在尝试从Newtonsoft.Json迁移到System.Text.Json。“[Newtonsoft.Json.JsonIgnore]”适用于在序列化期间忽略常量属性,但“[System.Text.Json.Serialization.JsonIgnore]”则不然。我想知道是否有解决办法。

所以我正在尝试迁移;

using Newtonsoft.Json;

public class MyClass: MyBaseClass
{
    [JsonIgnore]
    public const string MyConstString = "lets get rid of netwonsoft dependency";

    public string data;

    public String(string data)
    {
        this.data = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

到;

using System.Text.Json.Serialization;

public class MyClass: MyBaseClass
{
    [JsonIgnore] // Error
    public const string MyConstString = "lets get rid of netwonsoft dependency";

    public string data;

    public String(string data)
    {
        this.data = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

错误描述是; “属性‘JsonIgnore’在此声明类型上无效。它仅在‘属性,索引器’声明上有效。”

是因为 System.Text.Json 不支持 JsonIgnore 的这种使用,还是我遗漏了一些东西?我在此链接上找不到有关此问题的任何有用信息。你有什么想法吗?

Dav*_*idG 4

JSON.Net[JsonIgnore]属性的用法设置为AttributeTargets.Property | AttributeTargets.Field意味着它可以在const. 但是,新的 .NET Core API 版本[JsonIgnore]设置为AttributeTargets.Propertyonly。这意味着您只能在房产上使用它。

话虽如此,JSON.Net 不会序列化const值,除非您明确告诉它使用[JsonProperty]属性进行序列化,这使得添加另一个属性来忽略它有点奇怪。

例如,JSON.Net 会将您问题中的类序列化为:

{"data":"foo"}
Run Code Online (Sandbox Code Playgroud)

而序列化器System.Text.Json会给你这个:

{}
Run Code Online (Sandbox Code Playgroud)

所以另一个问题是新的 API 不序列化fields。由此得出的结论是,您应该使用现代 C# 技术,这意味着使用属性,例如:

public string data { get; set; }
Run Code Online (Sandbox Code Playgroud)