问题描述
不太确定如何表达标题抱歉。
我有两个从 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”成员的?
您需要保持对象的结构相同,但您仍然可以引入一个由 Event
和 Event1
共享的基类。
您可能打算做这样的事情。我冒昧地将您的类型重命名为更清晰一点:
// 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)]