C# 在JSON转换期间过滤掉某些子对象
我不知道如何用语言来解释我们的目标,所以我将直接跳到代码 使用我们当前的json转换器设置。我们在转换一个事件时得到以下结果C# 在JSON转换期间过滤掉某些子对象,c#,.net,serialization,json.net,deserialization,C#,.net,Serialization,Json.net,Deserialization,我不知道如何用语言来解释我们的目标,所以我将直接跳到代码 使用我们当前的json转换器设置。我们在转换一个事件时得到以下结果 { "PortfolioId": { "Id": "portId" }, "EntityId": { "Id": "3cf7582b-3cad-4aeb-a671-0132ba97d60d" }, "EventVersion": 1, "OccurredOn": "2018-08-08T09:
{
"PortfolioId": {
"Id": "portId"
},
"EntityId": {
"Id": "3cf7582b-3cad-4aeb-a671-0132ba97d60d"
},
"EventVersion": 1,
"OccurredOn": "2018-08-08T09:52:03.7871323+02:00",
"Id": "71fe3a2e-354a-4b19-abea-655471e96d72",
"Creator": {
"Id": "27a1d6b1-1ffa-4071-92ee-31c12bf120f0"
},
"CorrelationId": "3138dbe0-3a4d-4559-83e9-d1f3e5684ee8"
}
我们的目标是得到一个像这样的转换事件
{
"PortfolioId": "portId",
"EntityId": "3cf7582b-3cad-4aeb-a671-0132ba97d60d",
"EventVersion": 1,
"OccurredOn": "2018-08-08T09:52:03.7871323+02:00",
"Id": "71fe3a2e-354a-4b19-abea-655471e96d72",
"Creator": "27a1d6b1-1ffa-4071-92ee-31c12bf120f0",
"CorrelationId": "3138dbe0-3a4d-4559-83e9-d1f3e5684ee8"
}
在事件中,我们有一个特定类型的对象(即EntityId
,PortfolioId
),它保存属性中的值。所有这些Id类型都派生自属性为“Id”的抽象类
事件类如下所示
public class ExampleEvent : DomainEvent
{
public PortfolioId PortfolioId { get; }
public EntityId EntityId { get;}
public ExampleEvent(
PortfolioId portfolioId,
EntityId entityId,
UserId creator, Guid correlationId) : base(creator, correlationId)
{
PortfolioId = portfolioId;
EntityId = entityId;
}
}
有人知道怎么做吗。我认为使用自定义json转换器可能实现这一点,但目前还不知道如何在这种情况下实现这一点
编辑:我应该声明,这必须由一个或多个事件类型完成。为了保持低开销,通用的可重用解决方案似乎最适合。这意味着,如果事件类本身根本不被更改,这可能是最好的。(因此最好没有属性等)这个答案中的第二种方法可以帮助处理序列化。
您可以将JsonIgnore属性与计算属性一起使用:
public class PortfolioId
{
public string Id { get; set; }
}
public class EntityId
{
public string Id { get; set; }
}
public class UserId
{
public string Id { get; set; }
}
public class ExampleEvent
{
private ExampleEvent() // for JSON deserializer
{
Creator = new UserId();
Portfolio = new PortfolioId();
Entity = new EntityId();
}
// add your base constructor call
public ExampleEvent(PortfolioId portfolio, EntityId entity, UserId creator)
{
Creator = creator;
Portfolio = portfolio;
Entity = entity;
}
[JsonIgnore]
public UserId Creator { get; set; }
public string CreatorId
{
get => Creator.Id;
set => Creator.Id = value;
}
[JsonIgnore]
public PortfolioId Portfolio { get; set; }
public string PortfolioId
{
get => Portfolio.Id;
set => Portfolio.Id = value;
}
[JsonIgnore]
public EntityId Entity { get; set; }
public string EntityId
{
get => Entity.Id;
set => Entity.Id = value;
}
public int EventVersion { get; set; }
public string Id { get; set; }
public string CorrelationId { get; set; }
}
如果
JsonIgnore
不符合您的需要,或者您需要更多的自定义,您也可以使用JsonProperty查找IContractResolver
。应反序列化/JsonProperty。应序列化
。一些例子。@将军谢谢你的反应。我应该说我们有很多活动。因此,为每个事件构建转换器或包装器并不是真正有效的。这也会导致在执行新事件时产生更多的开销。啊,是的,我误解了你想要什么,请继续等待你的回复。然而,这可能会增加很多开销,因为在每个事件中都必须这样做,并且会使类变得非常混乱。@redlum这个JSON是如何使用的?它是用于API还是存储?它用于存储在事件存储中(事件源)@Read Noor,谢谢您的回复。这可能真的有用。你认为第二个答案是什么?他们使用的是ContractResolver。你认为我们能够将其与它们继承自的抽象类连接起来吗?@redlum是的,我认为你可以使用ContractResolver来实现这一点。在这个答案中,使用用于类型的合同变更作为指南。