如何用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
相关产品推荐
相关产品推荐

