You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求支持配置驱动的C#对象到对象映射库及参考方案

配置驱动型对象映射方案推荐(C#类库及非C#思路借鉴)

需求背景

开发API-to-API集成系统时,采用配置驱动+JSON规则+反射实现对象到对象的映射,适配不同客户的定制化工作流。现需要:

  1. 替代自研方案的成熟C#类库,需支持现有配置功能并优化单集合项映射的可读性
  2. 非C#技术栈的配置思路参考

自研方案现有配置功能

以下为当前自研实现的核心映射规则:

  • 简单与层级属性映射
{
    "DestinationProperty": "Shipment.Order.OrderNumber",
    "ApplySourcePropertyValue": "invoiceNumber"
}
  • 直接值映射
{
    "DestinationProperty": "Creditor.Type",
    "ApplyValue": "Organization"
}
  • 动态值映射
{
    "DestinationProperty": "SomeDate",
    "ApplyValue": "/UtcTimeSpan(-0.08:00:00)/"
}

其中/UtcTimeSpan(-0.08:00:00)/用于生成当前UTC时间提前8小时的日期值。

  • 集合映射
{
    "DestinationProperty": "Shipment.Order.OrderLineCollection[*].Product.Code",
    "ApplySourcePropertyCollectionSize": "OrderLines",
    "ApplyValue": "/Property(OrderLines[*].ProductCode)/-/Property(OrderLines[*].Attribute1)/-/Property(OrderLines[*].Attribute2)/"
}

通过/Property(...)语法从多个属性拼接复合值,同步集合长度。

  • 条件映射
[
    {
        "Conditions": [
            {
                "SourceProperty": "Carrier",
                "Operator": "=",
                "Value": "Castle Parcels - NZ - OA/NZC"
            },
            {
                "SourceProperty": "OriginZone",
                "Operator": "=",
                "Value": "AKL"
            }
        ],
        "DestinationProperty": "Creditor.Key",
        "ApplyValue": "CASPARAKL"
    },
    {
        "Conditions": [
            {
                "SourceProperty": "Carrier",
                "Operator": "=",
                "Value": "Castle Parcels - NZ - OA/NZC"
            },
            {
                "SourceProperty": "OriginZone",
                "Operator": "=",
                "Value": "CHC"
            }
        ],
        "DestinationProperty": "Creditor.Key",
        "ApplyValue": "CASPARCHC"
    }
]

基于多条件匹配设置目标属性值。

  • 单集合项映射(当前可读性待优化)
{
    "DestinationProperty": "logisticsCarrier",
    "ApplySourcePropertyValue": "Shipment.OrganizationAddressCollection[].CompanyName",
    "ApplySourcePropertyValueCollections": [
        {
            "CollectionIndex": 0,
            "SourceProperty": "AddressType",
            "Operator": "=",
            "Value": "TransportCompanyDocumentaryAddress"
        }
    ]
}

从集合中筛选符合条件的单个项映射到目标属性。

C#成熟类库推荐

1. Mapster

最适配配置驱动场景,支持动态加载映射规则,性能优于AutoMapper,天然支持大部分自研功能:

  • 简单/层级映射:通过TypeAdapterConfig配置,或加载JSON格式的映射规则(支持路径表达式)
  • 直接值映射:配置中指定固定值即可
  • 动态值映射:支持自定义转换器(如UtcTimeSpanConverter),可在配置中指定转换器类型
  • 集合映射:自动处理集合同步,复合值可通过表达式拼接(如$"{ProductCode}-{Attribute1}-{Attribute2}")
  • 条件映射:配置中支持Condition表达式,基于源属性值判断是否应用映射
  • 单集合项映射:支持使用LINQ表达式筛选集合项(如s => s.Shipment.OrganizationAddressCollection.FirstOrDefault(a => a.AddressType == "TransportCompanyDocumentaryAddress")?.CompanyName),配置可读性大幅提升

2. AutoMapper

生态成熟,支持通过Profile或动态配置实现需求:

  • 基础映射功能全覆盖,条件映射可通过Condition方法实现
  • 动态值映射需自定义IValueResolver
  • 单集合项映射可通过ResolveUsing结合LINQ筛选实现
  • 可通过自定义逻辑加载外部JSON配置(需编写适配层解析配置到AutoMapper规则)

非C#方案配置思路借鉴

Java生态

  • Dozer:支持XML/JSON配置文件定义映射规则,包含字段映射、自定义转换器、条件映射、集合映射。单集合项映射可通过自定义FieldMapper实现筛选逻辑
  • ModelMapper:支持基于表达式的配置,可通过when(Condition)方法实现条件映射,集合项筛选可通过Provider接口自定义

Python生态

  • Pydantic + JsonPath-NG:用Pydantic定义目标模型,通过JsonPath从源数据提取值,映射规则可存于YAML/JSON配置文件。动态值可通过自定义字段验证器实现,条件映射可结合JsonPath的条件表达式
  • JSONata:用JSONata表达式直接描述映射逻辑,支持条件判断($if())、集合遍历($map())、自定义函数,配置简洁且可读性高

通用思路

大部分非C#方案都遵循以下配置模式:

  1. 用JSON/YAML定义映射规则,包含目标路径、源路径/固定值、转换函数、条件表达式
  2. 内置或自定义转换器处理动态值(如时间偏移)
  3. 用表达式语言(如JsonPath、JSONata)简化集合筛选与复合值拼接

内容的提问来源于stack exchange,提问作者Gavin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:15:34