簡體   English   中英

使用 Groovy 3.0 的新 YamlBuilder 編寫文字 YAML 字段

[英]Write a literal YAML field using Groovy 3.0's new YamlBuilder

Groovy 3.0 有一個新的 YamlBuilder 類,它的工作方式與現有的 JsonBuilder 類類似。

我正在嘗試確定是否可以使用 YamlBuilder 在 YAML 中生成文字字段,例如:

data: |
  this is
  a literal
  text value

我的第一個猜測是 Groovy 的多行字符串會起作用:

new YamlBuilder() {
  data: '''\
this is
a literal
text value'''
}

但這給了我:

data: "this is\na literal\ntext value\n"`

我在 YamlBuilder Javadoc 中沒有看到任何有用的東西,並且 mrhaki 的示例沒有顯示這個用例。

有誰知道是否/如何做到這一點?

您可以執行以下操作:

import groovy.yaml.*
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.LITERAL_BLOCK_STYLE

def yaml = new YamlBuilder()

yaml {
  data '''\
this is
a literal
text value'''
}

println new ObjectMapper(new YAMLFactory().configure(LITERAL_BLOCK_STYLE, true)).writeValueAsString(yaml)

如果您需要自己的自定義序列化

在幕后,Groovy 的 YamlBuilder 正在使用 Jackson 的 JSON 到 YAML 轉換器。

Jackson 的轉換器確實支持文字塊樣式,但這需要啟用。 當前版本的 YamlBuilder 不支持設置選項。

我復制了 YamlBuilder 類和相關的 YamlConverter 類,以便我可以修改設置。

在 YamlBuilder 類中,我修改了這個方法:

public static String convertJsonToYaml(Reader jsonReader) {
    try (Reader reader = jsonReader) {
        JsonNode json = new ObjectMapper().readTree(reader);

        return new YAMLMapper().writeValueAsString(json);
    } catch (IOException e) {
        throw new YamlRuntimeException(e);
    }
}

要這樣:

public static String convertJsonToYaml(Reader jsonReader) {
    try (Reader reader = jsonReader) {
        JsonNode json = new ObjectMapper().readTree(reader);

        YAMLMapper mapper = new YAMLMapper()
        mapper.configure(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE, true)
        return mapper.writeValueAsString(json);
    } catch (IOException e) {
        throw new YamlRuntimeException(e);
    }
}

這讓我可以這樣做:

mapper.configure(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE, true)

這將成功將 Y​​AML 呈現為文字塊:

data: |-
  this is
  a literal
  text value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM