当前位置: 首页 > 知识库问答 >
问题:

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

韦知
2023-03-14

我想读入id,但不想在读入后设置它。在读取文件并反序列化时设置\u处理变量,以便可以对其进行设置。有没有一种内置的更优雅的处理方式?

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

共有3个答案

杭昊空
2023-03-14

我认为只使用私人设置器就可以了。只是不要再调用它了。如果这些是相同的,您也可以省略属性名称。

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

    [JsonProperty]
    public string id { get; private set; }
潘辰龙
2023-03-14

在C#7.3及更早版本中,可以使用空合并运算符,如下所示:

    set
    {
        _id = _id ?? value;
    }

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

    set
    {
        _id ??= value;
    }

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

赵献
2023-03-14

如果可以使用仅初始化属性(自C#9.0起)(https://docs.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; }
}

有关设置默认属性值(如果在json中找不到)的无关但有用的链接:json缺少属性的默认值。网

 类似资料:
  • 我的JSON字符串是: 我想要实现的是,当JSON中没有提供schemaVersion时,能够在默认情况下反序列化到SubClassV1,但即使在Superclass中将schemaVersion初始化为“1.0”时,我仍然会收到以下错误:

  • 问题内容: 我有一个简单的接口与属性的getter和setter。 我还有另一个实现此接口的UserAccount类。 我的问题是我想序列化money属性,但在反序列化它时忽略它,即,不接受用户对此属性的任何值。我在setter上尝试过@JsonIgnore,在getter上尝试过@JsonIgnore(false),它确实会忽略它,但是在序列化它时也会这样做。 我在setter上尝试了@Json

  • 我有另一个类UserAccount实现了这个接口。 我的问题是,我想序列化money属性,但在反序列化时忽略它,即不接受用户对该属性的任何值。我在setter上尝试了@jsonIgnore,在getter上尝试了@jsonIgnore(false),它确实忽略了它,但是它在序列化它的同时也忽略了它。 我在setter上尝试了@jsonIgnore,在getter上尝试了@jsonProperty,

  • 关于这个问题: 如何在使用JSON.NET序列化时更改属性名称? 会像预期的那样反序列化。 作为一个解决方案,没有属性也可以工作,或者类上有一个属性,比如:

  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将