反序列化JsonProperty时只允许设置属性的最佳方法是什么?

d4so4syb  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(101)

我想读入id,但不想在读入后设置它。_processing变量是在阅读文件和反序列化时设置的,因此可以设置它。有没有内置的更优雅的方法来处理这个问题?

private string _id;
    [JsonProperty(PropertyName = "id")]
    public string id
    {
        get { return _id; }
        set
        {
            if (_processing) // Only allow when reading the file
            {
                _id = value;
            }
        }
    }
olqngx59

olqngx591#

如果只能使用init属性(从C#9.0开始)(https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/init):

[JsonProperty(PropertyName = "id")]
public string Id { get; init; }

如果没有...

private string _id;
[JsonProperty(PropertyName = "id")]
public string Id
{
    get { return _id; }
    set { _id ??= value; } // could also throw if _id is not null
}

如果在json中找不到默认属性值,则提供设置默认属性值的相关但有用的链接:Default value for missing properties with JSON.net

2w3kk1z5

2w3kk1z52#

在C# 7.3和更早版本中,可以像这样使用空合并运算符:

set
    {
        _id = _id ?? value;
    }

在C# 8.0和更高版本中,您可以执行以下操作:

set
    {
        _id ??= value;
    }

**??=**如果左操作数的计算结果为非空,则运算符不计算其右操作数。

5t7ly7z5

5t7ly7z53#

我认为使用私有setter就可以了。只要不要再调用它。如果属性名称相同,也可以省略属性名称。

private string _id;
    [JsonProperty(PropertyName = "id")]
    public string id
    {
        get { return _id; }
        private set
        {
            _id = value;
        }
    }

[JsonProperty]
    public string id { get; private set; }

相关问题