如何实现REST API中JSON对象的字段映射(含嵌套结构)
JSON字段映射:处理嵌套对象的简便方案
我有一个接收JSON数据的REST API,数据字段来自另一记录系统,两者对同一事物的命名规则不同,需要把传入对象的字段映射到数据库存储对象的字段里。
比如传入的源对象是:
{ "caseId": 9876, "userId": 123456 }
需要转换成的目标存储对象是:
{ "case_id": 9876, "user": { "id": 123456 } }
像caseId这类平级字段的映射很简单,但对于userId这种需要映射到多层嵌套对象的字段,有没有可用的库或者简便技术?理想的方案是支持用类似下面的规则定义映射:
{ "caseId": "case_id", "userId": "user.id" }
可行方案
1. 用成熟库处理(分语言)
- JavaScript/TypeScript:可以用
lodash的_.set方法配合遍历实现,或者专门的object-path库。这类工具能直接解析user.id这种路径字符串,自动创建嵌套对象并赋值。 - Java:ModelMapper支持直接配置
userId -> user.id这种映射表达式,MapStruct则可以通过自定义转换器或@Mapping注解的expression属性实现嵌套映射。 - Python:
pydantic可以通过模型的model_dump配合字段别名实现,或者用mapper库支持路径式映射规则。
2. 自定义轻量实现(以JS为例)
如果场景简单,不想引入额外依赖,自己写个小函数就能搞定:
function mapFields(source, mappingRules) { const target = {}; for (const [srcKey, targetPath] of Object.entries(mappingRules)) { const value = source[srcKey]; const pathParts = targetPath.split('.'); let currentNode = target; pathParts.forEach((part, index) => { if (index === pathParts.length - 1) { currentNode[part] = value; } else { currentNode[part] = currentNode[part] || {}; currentNode = currentNode[part]; } }); } return target; } // 调用示例 const sourceData = { caseId: 9876, userId: 123456 }; const rules = { caseId: 'case_id', userId: 'user.id' }; const result = mapFields(sourceData, rules); console.log(result); // 输出:{ case_id: 9876, user: { id: 123456 } }
这个函数的核心逻辑是拆分映射规则里的路径字符串,逐层遍历创建嵌套对象,最后把源字段的值赋值到对应位置。如果需要处理数组、空值等边界情况,再针对性加逻辑即可。
内容的提问来源于stack exchange,提问作者Chase Denecke
相关产品推荐
相关产品推荐

