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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:01:44