如何在Ballerina中将带约束的JSON对象列表转换为自定义Record类型
实现带约束的JSON到自定义Record类型转换
1. 定义带约束的User类型
先明确User的结构与验证规则,用接口定义类型更直观:
// 定义User核心结构 interface User { id: number; username: string; password: string; } // 配置验证规则 const USER_RULES = { password: { minLength: 5 } };
2. 编写验证函数
单独实现验证逻辑,确保每个用户对象既符合类型结构,又满足值约束:
// 定义验证结果类型 type ValidateResult<T> = | { success: true; data: T } | { success: false; error: string }; function validateUser(rawUser: unknown): ValidateResult<User> { // 先判断是否为合法对象 if (typeof rawUser !== 'object' || rawUser === null) { return { success: false, error: '用户不是合法对象' }; } const { id, username, password } = rawUser as User; // 检查必填字段的类型合法性 if (typeof id !== 'number' || typeof username !== 'string' || typeof password !== 'string') { return { success: false, error: '缺少必填字段或字段类型错误' }; } // 验证密码长度约束 if (password.length < USER_RULES.password.minLength) { return { success: false, error: `密码长度不能小于${USER_RULES.password.minLength}位` }; } // 所有验证通过,返回合法User return { success: true, data: { id, username, password } }; }
3. 读取并批量转换JSON文件
读取JSON后遍历每个用户,逐一验证并收集结果:
import fs from 'fs/promises'; async function loadUsers(filePath: string): Promise<{ validUsers: User[]; errors: string[] }> { const validUsers: User[] = []; const errors: string[] = []; try { // 读取并解析JSON const rawContent = await fs.readFile(filePath, 'utf8'); const rawUsers = JSON.parse(rawContent); // 先检查JSON根结构是否为数组 if (!Array.isArray(rawUsers)) { errors.push('JSON内容不是用户数组格式'); return { validUsers, errors }; } // 逐个验证用户 rawUsers.forEach((user, index) => { const result = validateUser(user); if (result.success) { validUsers.push(result.data); } else { errors.push(`第${index + 1}个用户验证失败:${result.error}`); } }); } catch (err) { errors.push(`文件读取/解析失败:${(err as Error).message}`); } return { validUsers, errors }; }
4. 使用示例
调用函数并处理验证结果:
async function main() { const { validUsers, errors } = await loadUsers('./users.json'); if (errors.length > 0) { console.error('验证错误列表:'); errors.forEach(err => console.error(`- ${err}`)); } if (validUsers.length > 0) { console.log('验证通过的用户:'); validUsers.forEach(user => console.log(`ID: ${user.id}, 用户名: ${user.username}`)); } } main();
核心要点
- 不要依赖TypeScript的类型断言(
as User)直接转换,它仅在编译时生效,无法验证运行时的值约束。 - 验证逻辑分层:先检查结构合法性,再验证业务约束,确保每个用户都符合要求。
- 批量处理时保留错误信息和合法用户,避免单个错误导致整个流程中断(若需要全量验证通过才生效,可调整逻辑直接返回错误)。
内容的提问来源于stack exchange,提问作者Mohamed Ishad
相关产品推荐
相关产品推荐

