如何将含函数逻辑的Morphism映射Schema拆分至JSON文件并保留逻辑?
解决Morphism Schema含函数无法导出为JSON的问题
由于JSON格式不支持存储函数,我们需要将静态映射规则和动态转换逻辑拆分处理,具体方案如下:
1. 编写JSON格式的Schema配置
只在JSON文件中保存可序列化的映射规则,对于需要函数处理的字段,用唯一标识字符串代替函数逻辑。
示例canonicalSchema.json内容:
{ "username": "USERNAME_EXTRACTOR", "disabilityInfo": "DISABILITY_INFO_TRANSFORMER", "email": "user.contact.email" }
2. 在JS中绑定函数逻辑
导入JSON配置后,将标识字符串替换为实际的转换函数,再传入Morphism使用。
示例代码:
const morphism = require('morphism'); // 导入JSON Schema const rawSchema = require('./canonicalSchema.json'); // 定义所有转换函数 const transformers = { USERNAME_EXTRACTOR: (input) => input.user.profile.name.split(' ')[0], DISABILITY_INFO_TRANSFORMER: (input) => ({ hasDisability: input.disability.status === 'active', type: input.disability.type }) }; // 合并Schema:替换标识为实际函数 const canonicalSchema = Object.fromEntries( Object.entries(rawSchema).map(([key, value]) => [ key, transformers[value] || value ]) ); // 测试转换 const input = { user: { profile: { name: 'Alice Smith' }, contact: { email: 'alice@example.com' } }, disability: { status: 'active', type: 'hearing' } }; const output = morphism(canonicalSchema, input); console.log(output);
3. 简化方案(适合字段较少的场景)
如果不需要统一管理标识,也可以直接在JS中扩展JSON Schema,覆盖需要函数处理的字段:
const rawSchema = require('./canonicalSchema.json'); // 直接扩展Schema,添加函数逻辑 const canonicalSchema = { ...rawSchema, username: (input) => input.user.profile.name.split(' ')[0], disabilityInfo: (input) => ({ hasDisability: input.disability.status === 'active', type: input.disability.type }) };
这种方式更直观,无需额外的标识映射,适合Schema结构简单的场景。
关键说明
- 核心思路是分离可序列化配置与不可序列化的函数逻辑,JSON只存静态规则,函数单独在JS中实现
- 标识字符串要保证唯一性,避免和正常的字段路径字符串冲突
- 复杂的转换函数可以抽成独立工具模块,方便维护和复用
内容的提问来源于stack exchange,提问作者R.Almoued
相关产品推荐
相关产品推荐

