如何在C#中使用Newtonsoft将两个属性序列化为一个json属性?

yc0p9oo0  于 2023-10-21  发布在  C#
关注(0)|答案(1)|浏览(179)

在ScanInfo类中,有两个版本的扫描结果。但是这两个属性中只有一个是空的,另一个属性将有值。在本例中,我只想序列化非空属性,输出json属性名为“scanResult”。当我尝试序列化时,当前代码将报告属性名称冲突。我该怎么办?

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”引用。

q35jwt9p

q35jwt9p1#

一种解决方案是将[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;
            }
        }
    }
}

这里有一个快速的gif,显示它的工作原理:

相关问题