在ScanInfo类中有两个版本的扫描结果.但这两个属性中只有一个将为空,另一个属性将具有值.在本例中,我只想序列化非空属性,输出的json属性名为"scanResult".当我try 序列化时,当前代码将报告属性名称冲突.我怎么才能解决这个问题呢?

public class ScanInfo
{
    [JsonProperty("scanResult", NullValueHandling = NullValueHandling.Ignore)]
    public ScanResult oldVersion;

    [JsonProperty("scanResult", NullValueHandling = NullValueHandling.Ignore)]
    public ScanResultNew newVersion;

}

public class ScanResult 
{
    public DateTime StartTime;
    public DateTime EndTime;
    public IDictionary<string, long> statistic;
}
public class ScanResultNew 
{
    public DateTime StartTime;
    public DateTime EndTime;
    public Statistic statistic;
    public string status;
}

JSON输出:

{
    "scanResult":...
}

enter image description here

我的目标是,它们中只有一个应该被序列化,并且都应该通过属性名"scanResult"来引用.

推荐答案

一种解决方案可能是将[JsonIgnore]属性添加到当前的两个ScanResult字段,并添加一个新的公共属性来序列化为"scanResult".这个新属性可以对要序列化的结果进行"过滤".

下面是一个例子:

public class ScanInfo
{
    [JsonIgnore]
    public ScanResult oldVersion;

    [JsonIgnore]
    public ScanResult newVersion;

    [JsonProperty("scanResult", NullValueHandling = NullValueHandling.Ignore)]
    public ScanResult ActualScanResult
    {
        get
        {
            if(newVersion != null) 
            {
                return newVersion;
            }
            else
            {
                return oldVersion;
            }
        }
    }
}

这里有一个快速演示,说明它是有效的:

Screen recording while debugging the code, to show that the solution works.

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

MongoDB将JS查询转换为C#的问题

为什么这个Reflection. Emit代码会导致一个DDL ViolationException?

ASP.NET Core 8.0 JWT验证问题:尽管令牌有效,但SecurityTokenNoExpirationError异常

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

C#.NET依赖项注入顺序澄清

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

Azure函数中实体框架核心的依赖注入

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

确定System.Text.Json序列化中是否无法识别Type

如何防止Visual Studio断点以红色突出显示到整行?

GODOT 4向C#中的字符串参数发送信号以等待

为值对象编写自定义JsonConverter

如何在.NET MAUI中最大化GraphicsView的大小?

MSI无法将快捷方式添加到启动文件夹

RCL在毛伊岛应用程序和Blazor服务器应用程序.Net 8.0中使用页面

如何对特定异常使用Polly重试机制?

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值