组合两个内部有部分类的类

问题描述

不太确定如何表达标题抱歉。

我有两个从 JSON 到 C# 在线转换器生成的类。这些类使我可以反序列化一些 JSON 对象并将它们转换为我可以在程序中其他地方使用的对象。我使用的转换器给了我这两个类:

namespace testing
{

    public partial class stopEvent
    {
        [JsonProperty("event")]
        public Event1 Event { get; set; }
    }

    public partial class Event1
    {
        [JsonProperty("Name")]
        public string Name { get; set; }

        [JsonProperty("ID")]
        public string Id { get; set; }

        [JsonProperty("sessID")]
        public long SessId { get; set; }

        [JsonProperty("startTime")]
        public DateTime StartTime { get; set; }

        [JsonProperty("endTime")]
        public DateTime EndTime { get; set; }

        [JsonProperty("Number")]
        public string Number { get; set; }

        [JsonProperty("Percentage")]
        public string Percentage { get; set; }
    }
}

这是我的第二个对象,它代表一个开始事件。

using System;
using Newtonsoft.Json;

namespace testing
{
    public partial class startEvent
    {
        [JsonProperty("event")]
        public Event Event { get; set; }
    }

    public partial class Event
    {
        [JsonProperty("Name")]
        public string Name { get; set; }

        [JsonProperty("ID")]
        public string Id { get; set; }

        [JsonProperty("sessID")]
        public long SessId { get; set; }

        [JsonProperty("startTime")]
        public DateTime StartTime { get; set; }

        [JsonProperty("Number")]
        public long Number { get; set; }

        [JsonProperty("rfID")]
        public string RfId { get; set; }

        [JsonProperty("startPercentage")]
        public string startPercentage { get; set; }
    }
}

当我在我的代码中使用这些并反序列化 json 并将其转换为对象时,它工作正常。我不得不将事件从第二个类重命名为 Event1,否则它将与第一个分类具有相同的名称

但是,我注意到两个类中有很多重复的字段,所以我想我可以创建一个超类,然后两者都可以从那里继承。这是我的超级班:

public class Event
{
    [JsonProperty("Name")]
    public string Name { get; set; }
    
    [JsonProperty("ID")]
    public string Id { get; set; }
    
    [JsonProperty("sessID")]
    public long SessId { get; set; }
    
    [JsonProperty("startTime")]
    public DateTime StartTime { get; set; }
    
    [JsonProperty("Number")]
    public long Number { get; set; }
}

然后我更改了类,使它们看起来像这样:

public class stopEvent : Event
{
    [JsonProperty("Percentage")]
    public string Percentage { get; set; }
}

与 startEvent 相同。但是,当我尝试在程序的反序列化部分中实现它时,它不起作用 - 所有值都返回为 null,我不知道为什么。

编辑:

反序列化如下:

        stopEvent StopEvent = JsonConvert.DeserializeObject<stopEvent>(message);

解决方法

在您更改之前,您的 startEvent 类有一个名为 event 的属性,该属性随后包含更多数据。相应的 JSON 如下所示:

{
    "startEvent":
    {
        "Name": "...","ID": "...",...
    }
}

更改后,您的 startEvent 类现在继承自 Event,而不是将 Event 作为属性。这意味着相应的 JSON 将类似于:

{
    "Name": "...",...
}

看看你是如何失去“startEvent”成员的?

您需要保持对象的结构相同,但您仍然可以引入一个由 EventEvent1 共享的基类。

您可能打算做这样的事情。我冒昧地将您的类型重命名为更清晰一点:

// Common properties between all event data types
public abstract class EventDataBase
{
    [JsonProperty("Name")]
    public string Name { get; set; }

    [JsonProperty("ID")]
    public string Id { get; set; }

    [JsonProperty("sessID")]
    public long SessId { get; set; }

    [JsonProperty("startTime")]
    public DateTime StartTime { get; set; }

    [JsonProperty("Number")]
    public long Number { get; set; }
}

// Fields which just the start event data has
public class StartEventData : EventDataBase
{
    [JsonProperty("rfID")]
    public string RfId { get; set; }

    [JsonProperty("startPercentage")]
    public string startPercentage { get; set; }
}

// Start event,which uses the start event data
public class StartEvent
{
    [JsonProperty("event")]
    public StartEventData Event { get; set; }
}

// Fields which just the stop event data has
public class StopEventData : EventDataBase
{
    [JsonProperty("Number")]
    public long Number { get; set; }
}

// Stopevent,which uses the start event data
public class StopEvent
{
    [JsonProperty("event")]
    public StopEventData Event { get; set; }
}
,

您更改了对象的结构,因此 JSON 不再匹配。 stopEvent 曾经有一个属性 Event,但您将其更改为从 Event 继承,因此它不再具有该属性 - 相反,它直接拥有所有属性,这是不再与 JSON 同步。

如果您自己创建一个 stopEvent 实例并将其序列化,然后与您尝试反序列化的 JSON 进行比较,您就会看到这一点。它们将具有不同的结构。

修复方法是还原您的更改,或者更新传入的 JSON 以匹配您的新对象(如果您可以控制的话)。

,

为了考虑继承的属性。您可以尝试在子类中添加“MemberSerialisation”属性

[JsonObject(MemberSerialization = MemberSerialization.Fields)]