yaml 解析时出错。预期 <block end>,但找到 <scalar>

Posted

技术标签:

【中文标题】yaml 解析时出错。预期 <block end>,但找到 <scalar>【英文标题】:yaml Error while parsing. Expected <block end>, but found <scalar> 【发布时间】:2017-10-16 20:13:29 【问题描述】:

我正在尝试使用 got-swag(npm 包)测试一个 swagger api

当我尝试使用 json 架构验证 json 响应时,当单独的 yaml 文件合并为一个 yaml 和 json 文件时,我会收到 parseError。起源是 -validate() 行。 validate() 源自 got-swag 包,但它在底层 jsonschema.validate(data, schema); 依赖项

中失败了
 x-tests:
        - description: Should return array of ferries
          steps:
            - get('/api/get/link/ferries')
            - equal(res.statusCode, 200)
            - ok(res.json.length > 0)
            - validate(res.json,  $ref: '#/definitions/ferry')

这是产生的错误:

           throw new exports.ParserError('while parsing a block mapping', this.marks.slice(-1)[0], "expected <block end>, but found " + token.id, token.start_mark);
        ^
while parsing a block mapping
  on line 29, column 15
expected <block end>, but found <scalar>
  on line 29, column 76
    at ParserError.YAMLError [as constructor] (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\errors.js:70:46)
    at ParserError.MarkedYAMLError [as constructor] (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\errors.js:90:45)
    at new ParserError (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\parser.js:17:48)
    at Loader.__dirname.Parser.Parser.parse_block_mapping_key (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\parser.js:433:15)
    at Loader.__dirname.Parser.Parser.check_event (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\parser.js:61:48)
    at Loader.__dirname.Composer.Composer.compose_mapping_node (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\composer.js:248:20)
    at Loader.__dirname.Composer.Composer.compose_node (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\composer.js:160:21)
    at Loader.__dirname.Composer.Composer.compose_sequence_node (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\composer.js:216:30)
    at Loader.__dirname.Composer.Composer.compose_node (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\composer.js:158:21)
    at Loader.__dirname.Composer.Composer.compose_mapping_node (C:\Users\dvbets\Documents\Workspace\Repos\node_modules\yaml-js\lib\composer.js:250:27)

【问题讨论】:

【参考方案1】:

该行需要用引号引起来以转义内部: 字符:

- "validate(res.json,  $ref: '#/definitions/ferry')"
                           ^

: 是 YAML 中的特殊字符,key: value 对的分隔符。如果不进行转义,该行将被解析为键名 validate(res.json, $ref,值为 '#/definitions/ferry'),并且解析器在结束引号后的 ) 上阻塞。

相关:How to escape indicator characters (i.e. : or - ) in YAML

【讨论】:

以上是关于yaml 解析时出错。预期 <block end>,但找到 <scalar>的主要内容,如果未能解决你的问题,请参考以下文章

使用Jackson API解析YAML文件时出错

Azure DevOps YAML 管道错误:解析块映射时未找到预期的密钥

ValueError:检查目标时出错:预期 block5_pool 有 4 个维度,但得到了形状为 (60000, 10) 的数组

Google App Engine“解析./app.yaml时出错:未知的url处理程序类型”

Google App Engine Node.js 应用程序 - “解析 app.yaml 时出错:未知 url 处理程序类型”

解析参数“--change-batch”时出错:预期:“=”,接收到:“”用于输入: