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

如何用JavaScript验证API响应为YAML而非JSON或纯文本?

验证YAML格式(排除JSON/纯文本)的方案

由于JSON是YAML的子集,js-yaml.load()会兼容解析JSON,同时纯文本(如单一字符串)也会被解析为对应类型,所以需要通过多步骤校验来区分纯YAML、JSON和纯文本。以下是几种可行方案:

方案一:先排除JSON,再校验YAML结构

核心思路:先尝试用JSON.parse()解析内容,能成功则说明是JSON(直接排除);若失败,再用js-yaml解析,同时校验解析结果是否为结构化数据(排除纯文本)。

const yaml = require('js-yaml');

function isValidYAML(content) {
    // 第一步:排除JSON格式
    try {
        JSON.parse(content);
        return false;
    } catch {}

    // 第二步:校验是否为合法YAML,且是结构化数据(排除纯文本)
    try {
        const parsedData = yaml.load(content);
        // 只接受对象或数组类型的YAML,排除单一字符串/数字等纯文本
        return typeof parsedData === 'object' && parsedData !== null;
    } catch {
        return false;
    }
}

方案二:结合YAML特有语法标记校验

如果需要更严格的校验(比如只接受带有YAML专属特征的内容),可以先检查内容中是否存在YAML特有的语法元素,再进行解析校验:

const yaml = require('js-yaml');

function isYAMLWithUniqueSyntax(content) {
    // 检查是否包含YAML专属标记:文档分隔符---、注释#、锚点&、别名*
    const hasYAMLMarkers = /^---\s*$|#.*$|&.*$|\*.*$/m.test(content);

    // 若没有专属标记,先排除JSON
    if (!hasYAMLMarkers) {
        try {
            JSON.parse(content);
            return false;
        } catch {}
    }

    // 最后校验YAML合法性和结构化
    try {
        const parsedData = yaml.load(content);
        return typeof parsedData === 'object' && parsedData !== null;
    } catch {
        return false;
    }
}

方案三:利用js-yaml的底层解析器获取Token

如果需要更精细的控制,可以直接使用js-yaml的解析器获取语法Token,检查是否存在YAML特有的Token类型(如注释、锚点等):

const yaml = require('js-yaml');
const { Parser } = yaml;

function isStrictYAML(content) {
    try {
        // 尝试解析为JSON,排除JSON格式
        JSON.parse(content);
        return false;
    } catch {}

    try {
        const parser = new Parser();
        parser.parse(content);
        // 获取所有解析Token,检查是否有YAML特有的Token
        const hasYAMLSpecificTokens = parser.tokens.some(token => 
            token.type === 'COMMENT' || token.type === 'ANCHOR' || token.type === 'ALIAS'
        );

        // 若没有特有Token,再检查解析结果是否为结构化数据
        if (!hasYAMLSpecificTokens) {
            const parsedData = yaml.load(content);
            return typeof parsedData === 'object' && parsedData !== null;
        }
        return true;
    } catch {
        return false;
    }
}

注意事项

  • 以上方案均不依赖content-type,完全基于内容本身校验。
  • 方案一适合大多数场景,平衡了准确性和复杂度;方案二适合需要严格区分YAML与JSON的场景;方案三适合极端定制化的校验需求。

内容的提问来源于stack exchange,提问作者anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:40:26