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

如何将含函数逻辑的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:41:08