寻求支持配置驱动的C#对象到对象映射库及参考方案
配置驱动型对象映射方案推荐(C#类库及非C#思路借鉴)
需求背景
开发API-to-API集成系统时,采用配置驱动+JSON规则+反射实现对象到对象的映射,适配不同客户的定制化工作流。现需要:
- 替代自研方案的成熟C#类库,需支持现有配置功能并优化单集合项映射的可读性
- 非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#方案都遵循以下配置模式:
- 用JSON/YAML定义映射规则,包含目标路径、源路径/固定值、转换函数、条件表达式
- 内置或自定义转换器处理动态值(如时间偏移)
- 用表达式语言(如JsonPath、JSONata)简化集合筛选与复合值拼接
内容的提问来源于stack exchange,提问作者Gavin
相关产品推荐
相关产品推荐

