Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serializing multiline string from JsonNode to YAML string adds double quotes and "\n"

I have a YAML string where one of the attributes looks like this:

 description: |
    this is my description  //imagine there's a space after description
    this is my description in the second line

In my Java code I read it into a JsonNode like this:

JsonNode node = new YamlMapper().readTree(yamlString);

I then do some changes to it and write it back to a string like this:

new YamlMapper().writeValueAsString(node))

The new string now looks like this:

"this is my description \nthis is my description in the second line\n"

So now in the YAML file you can see the added quotes + the new line character (\n) and everything is in one line. I expect it to return the original YAML like the one above.

This is how my YAML object mapper is configured:

 new ObjectMapper(
        new YAMLFactory()
          .disable(YAMLGenerator.Feature.MINIMIZE_QUOTES))
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

If I remove the space after description in the original YAML, it works just fine

like image 482
kimi1990mp Avatar asked Oct 21 '25 04:10

kimi1990mp


1 Answers

To serialize multiline text using jackson. Jackson introduced a new flag YAMLGenerator.Feature.LITERAL_BLOCK_STYLE since version 2.9, which can be turned on as:

new ObjectMapper(
    new YAMLFactory().enable(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE)
).writeValueAsString(new HashMap<String, String>(){{
    put("key", "test1\ntest2\ntest3");
}});

The output won't be wrapped with quotes:

---
key: |-
  test1
  test2
  test3

Note there is a few differences between "block scalars": |, |-, >..., you can check out at https://yaml-multiline.info/

like image 116
AssKicker Avatar answered Oct 23 '25 19:10

AssKicker



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!