使用 JSON Schema 重新映射 JSON 数据
使用 JSON Schema 重新映射 JSON 数据
JSON Schema 可以用来定义 JSON 数据的结构,而通过它来重新映射 JSON 数据,通常需要结合代码实现。下面介绍如何使用 JavaScript 结合 JSON Schema 来实现 JSON 数据的映射转换。
核心实现思路
实现 JSON 数据重新映射主要通过以下步骤:
- 定义目标 JSON Schema 结构
- 编写映射逻辑函数
- 根据 Schema 规则转换原始数据
下面是一个完整的 JavaScript 实现示例:
javascript
运行
/**
* 根据JSON Schema重新映射JSON数据
* @param {object} sourceData 原始JSON数据
* @param {object} schema 目标JSON Schema
* @returns {object} 映射后的JSON数据
*/
function remapJsonBySchema(sourceData, schema) {
const result = {};
// 遍历Schema中的每个字段
for (const field in schema.properties) {
const fieldSchema = schema.properties[field];
// 检查是否有映射规则
const mapFrom = fieldSchema.extensions?.mapFrom;
const transform = fieldSchema.extensions?.transform;
if (mapFrom) {
// 从原始数据中获取对应字段
let value = sourceData;
const path = mapFrom.split('.');
// 按路径获取嵌套属性
for (const part of path) {
if (value && typeof value === 'object') {
value = value[part];
} else {
value = undefined;
break;
}
}
// 应用转换函数
if (transform && typeof transform === 'function') {
value = transform(value);
}
// 设置结果字段(仅当值存在且非undefined时)
if (value !== undefined) {
result[field] = value;
}
}
}
return result;
}
// 示例:定义扩展的JSON Schema(使用extensions添加映射规则)
const targetSchema = {
type: 'object',
properties: {
// 基础字段映射
userId: {
type: 'string',
extensions: {
mapFrom: 'user.id' // 从原始数据的user.id字段映射
}
},
userName: {
type: 'string',
extensions: {
mapFrom: 'user.name',
// 转换函数:将姓名首字母大写
transform: (name) => name?.charAt(0)?.toUpperCase() + name?.slice(1)
}
},
// 计算字段映射
isPremium: {
type: 'boolean',
extensions: {
// 复杂映射:根据多个字段计算
transform: (sourceData) => {
return sourceData.subscription &&
sourceData.subscription.type === 'premium' &&
sourceData.subscription.active;
}
}
},
// 数组映射
favoriteItems: {
type: 'array',
items: {
type: 'string'
},
extensions: {
mapFrom: 'items',
// 数组转换:只保留active为true的项目名称
transform: (items) => {
return items?.filter(item => item.active)?.map(item => item.name) || [];
}
}
}
}
};
// 原始JSON数据示例
const sourceData = {
user: {
id: 'u12345',
name: 'john doe',
email: 'john@example.com'
},
subscription: {
type: 'premium',
active: true,
expires: '2025-12-31'
},
items: [
{ id: 1, name: '笔记本', active: true },
{ id: 2, name: '钢笔', active: false },
{ id: 3, name: '书签', active: true }
]
};
// 执行映射
const mappedData = remapJsonBySchema(sourceData, targetSchema);
console.log('映射后的数据:', mappedData);
代码功能说明
上述代码实现了以下核心功能:
-
映射规则定义:通过在 JSON Schema 中添加
extensions字段,支持:mapFrom:指定原始数据中的字段路径(支持点号.嵌套路径)transform:自定义转换函数,可处理复杂映射逻辑
-
数据转换逻辑:
- 支持基础字段映射(如
userId映射自user.id) - 支持字段值转换(如
userName首字母大写) - 支持基于多字段的计算映射(如
isPremium) - 支持数组数据的过滤和转换(如
favoriteItems)
- 支持基础字段映射(如
-
容错处理:
- 自动处理字段不存在的情况
- 避免因数据结构不匹配导致的错误
实际应用场景
这种映射方法适用于:
- 前后端数据格式转换(如 API 响应数据格式化)
- 不同系统间的数据集成(解决字段命名不一致问题)
- 数据清洗和规范化(如日期格式统一、字段值转换)
- 旧系统数据迁移(映射到新的数据结构)
扩展建议
如果需要更复杂的映射功能,可以:
- 使用成熟的库(如
json-mapper、json-schema-to-typescript) - 扩展 Schema 规则(如添加
defaultValue、requiredIf等规则) - 结合 JSON Schema 验证功能(确保映射后的数据符合结构要求)
通过这种方式,JSON Schema 不仅能定义数据结构,还能成为数据转换的规则引擎,提高数据处理的灵活性和可维护性。
使用 JSON Schema 重新映射 JSON 时,可借助其定义结构的能力结合自定义逻辑实现字段转换。以下是核心实现方式及示例:
核心实现方式
通过在 JSON Schema 中扩展自定义字段(如
x-mapFrom)指定映射规则,再编写函数按规则转换数据。常见步骤如下:- 定义带映射规则的 Schema:用
x-mapFrom指定原始字段路径,x-transform定义转换函数。 - 实现映射函数:解析 Schema 规则,从原始数据提取字段并转换。
代码示例(JavaScript)
javascript
运行
// 映射函数:根据Schema将原始JSON转换为目标结构
function remapJsonBySchema(sourceData, schema) {
const result = {};
// 遍历Schema的属性字段
for (const field in schema.properties) {
const fieldSchema = schema.properties[field];
const mapFrom = fieldSchema['x-mapFrom']; // 原始字段路径
const transform = fieldSchema['x-transform']; // 转换函数
if (mapFrom) {
// 按路径提取原始值(支持嵌套字段,如"user.info.name")
let value = sourceData;
const path = mapFrom.split('.');
for (const part of path) {
if (value && typeof value === 'object') {
value = value[part];
} else {
value = undefined;
break;
}
}
// 应用转换函数
if (transform && typeof transform === 'function') {
value = transform(value);
}
// 非空时存入结果
if (value !== undefined) {
result[field] = value;
}
}
}
return result;
}
// 示例:带映射规则的JSON Schema
const targetSchema = {
type: 'object',
properties: {
// 基础映射:user.id → userId
userId: {
type: 'string',
'x-mapFrom': 'user.id'
},
// 带转换的映射:user.name → userName(首字母大写)
userName: {
type: 'string',
'x-mapFrom': 'user.name',
'x-transform': (name) => name?.charAt(0)?.toUpperCase() + name?.slice(1)
},
// 数组映射:items中active为true的name → favoriteItems
favoriteItems: {
type: 'array',
items: { type: 'string' },
'x-mapFrom': 'items',
'x-transform': (items) =>
items?.filter(item => item.active)?.map(item => item.name) || []
},
// 计算映射:根据subscription字段判断是否为高级用户
isPremium: {
type: 'boolean',
'x-transform': (sourceData) =>
sourceData.subscription?.type === 'premium' &&
sourceData.subscription?.active
}
}
};
// 原始JSON数据
const sourceData = {
user: { id: 'u123', name: 'alice smith' },
subscription: { type: 'premium', active: true },
items: [{ id: 1, name: 'book', active: true }, { id: 2, name: 'pen', active: false }]
};
// 执行映射
const mappedData = remapJsonBySchema(sourceData, targetSchema);
console.log(mappedData);
// 输出:
// {
// userId: 'u123',
// userName: 'Alice Smith',
// favoriteItems: ['book'],
// isPremium: true
// }
关键功能说明
- 映射规则扩展:通过
x-mapFrom(或自定义字段)指定原始字段路径,x-transform支持函数处理复杂逻辑(如数组过滤、多字段计算)。 - 嵌套字段处理:通过点号分隔路径(如
user.id)获取深层数据,自动处理路径不存在时的容错。 - 类型转换:可在
x-transform中自定义类型转换(如字符串转日期、数值格式化等)。
实际应用场景
- 前后端数据格式适配:将后端 API 响应的字段名(如
user_id)映射为前端所需的驼峰式命名(userId)。 - 数据清洗与规范化:统一不同来源数据的格式(如日期字符串转
Date对象)。 - 系统集成:在微服务间转换不同数据结构(如订单系统与用户系统的数据字段映射)。
进阶方案
若需更复杂的映射能力,可结合以下方案:
- 使用成熟库:如
json-mapper、normalizr,支持更灵活的映射规则配置。 - 结合 JSON Schema 验证:映射后的数据可通过
ajv等库验证,确保符合目标结构。 - 扩展规则:在 Schema 中添加
x-default(默认值)、x-requiredIf(条件必填)等规则,增强映射鲁棒性。
摘抄自网络,便于检索查找。

浙公网安备 33010602011771号