C# 在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:

我不知道如何用语言来解释我们的目标,所以我将直接跳到代码

使用我们当前的json转换器设置。我们在转换一个事件时得到以下结果

{
    "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来实现这一点。在这个答案中,使用用于类型的合同变更作为指南。