Skip to content

YAML - ScannerException on block scalar "\n" #568

@benken-parasoft

Description

@benken-parasoft

I'm copying this from https://bitbucket.org/snakeyaml/snakeyaml-engine/issues/67/scannerexception-on-block-scalar-n

The text “\n” does not serialize correctly.

Trivial reproduction example (Jackson 3):

StringWriter writer = new StringWriter();
YAMLFactory yamlFactory = YAMLFactory.builder()
        .enable(YAMLWriteFeature.MINIMIZE_QUOTES)
        .build();
try (JsonGenerator generator = yamlFactory.createGenerator(ObjectWriteContext.empty(), writer)) {
    generator.writeString("\n");
}
System.out.println(writer.toString());  // prints "--- |2+"
try (JsonParser parser = yamlFactory.createParser(ObjectReadContext.empty(), writer.toString())) {
    parser.nextToken();  // fails!
}

Stack trace:

tools.jackson.dataformat.yaml.JacksonYAMLParseException: while scanning a block scalar
 in reader, line 1, column 5:
    --- |2+
        ^
 the leading empty lines contain more spaces (2) than the first non-empty line.
 in reader, line 3, column 1:

    ^

 at [Source: (StringReader); line: 1, column: 4]
    at tools.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:308)
...
Caused by: while scanning a block scalar
 in reader, line 1, column 5:
    --- |2+
        ^
 the leading empty lines contain more spaces (2) than the first non-empty line.
 in reader, line 3, column 1:

    ^

    at org.snakeyaml.engine.v2.scanner.ScannerImpl.scanBlockScalar(ScannerImpl.java:1578)
    at org.snakeyaml.engine.v2.scanner.ScannerImpl.fetchBlockScalar(ScannerImpl.java:960)
    at org.snakeyaml.engine.v2.scanner.ScannerImpl.fetchLiteral(ScannerImpl.java:938)
    at org.snakeyaml.engine.v2.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:396)
    at org.snakeyaml.engine.v2.scanner.ScannerImpl.checkToken(ScannerImpl.java:193)
    at org.snakeyaml.engine.v2.parser.ParserImpl$ParseDocumentContent.produce(ParserImpl.java:558)
    at org.snakeyaml.engine.v2.parser.ParserImpl.lambda$produce$1(ParserImpl.java:232)
    at java.base/java.util.Optional.ifPresent(Optional.java:178)
    at org.snakeyaml.engine.v2.parser.ParserImpl.produce(ParserImpl.java:232)
    at org.snakeyaml.engine.v2.parser.ParserImpl.peekEvent(ParserImpl.java:206)
    at org.snakeyaml.engine.v2.parser.ParserImpl.next(ParserImpl.java:214)
    at tools.jackson.dataformat.yaml.YAMLParser.nextEvent(YAMLParser.java:446)
    at tools.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:306)
    ... 4 more

This reproduces with Jackson 3.0.0-rc6. I tried snakeyaml-engine versions 2.10, 2.9, and 2.8 but they all fail on this case. This type of issue does NOT happen when using snakeyaml 2.4 and Jackson 2.19.

I am trying to migrate from snakeyaml to snakeyaml-engine but am blocked where a lot of my cases fail because of this issue. I am serializing various complex objects and arrays and fail any time there is a String with empty lines (one or more “\n”).

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.xyamlIssue related to YAML format backend

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions