C# System.Text.Json反序列化,其中有两个可能的属性名

C# System.Text.Json反序列化,其中有两个可能的属性名,c#,system.text.json,C#,System.text.json,是否可以将JSON反序列化为属性名可以是两个值之一的类 例如,这两个JSON都将反序列化为同一个属性: var json1 = "{\"A\":5}"; var json2 = "{\"B\":5}"; 我想也许我可以使用JsonPropertyName属性两次 [JsonPropertyName("A")] [JsonPropertyName(&

是否可以将JSON反序列化为属性名可以是两个值之一的类

例如,这两个JSON都将反序列化为同一个属性:

        var json1 = "{\"A\":5}";
        var json2 = "{\"B\":5}";
我想也许我可以使用JsonPropertyName属性两次

    [JsonPropertyName("A")]
    [JsonPropertyName("B")]
    public int SomeInt { get; set; }
这是不允许的

然后我想,如果反序列化程序找不到JsonPropertyName属性,它可能会查找实际的属性名

    [JsonPropertyName("A")]
    public int B { get; set; }

但这也不起作用。

您可以有两个单独的属性,一个委托给另一个:

[JsonPropertyName("A")]
[Obsolete("Explain why here")]
public int A
{
    get => B;
    set => B = value;
}

[JsonPropertyName("B")]
public int B { get; set; }
缺点是在序列化时两者都会被写入。我原本以为可以对过时的属性使用
JsonIgnoreAttribute
,但这会阻止它也被反序列化:(如果您只是将其用于解析,这并不坏,但是如果您也在序列化,这会让人不快


此外,如果您使用这两个属性解析JSON文件,那么最后一个将获胜,这可能并不理想。

这两个JSON都将反序列化为相同的属性
,它们不应该,您将
a
作为属性,将
B
作为属性。此外,还将使用自定义
JsonConverter
您需要做的是。可以反序列化为具有a和B的类,然后使用所需的规则进行投影。如果两个键在同一个json中会发生什么情况?@Magnetron选择第一个匹配项:),如果值为0和5会发生什么?您如何知道您首先得到了0,并且应该忽略5,或者如果0是因为您没有得到任何值并且int不能为null?