在k8s中所有的资源或者配置文件都可以用 YAML 或 JSON 定义。YAML 是一个 JSON 的超集,任何有效 JSON 文件也都是一个有效的 YAML 文件。但比起JSON,YAML 的格式更加简洁清晰,本文将介绍两种在 JAVA 中将 JSON 字符串转换为 YAML 字符串的方式。

一、使用 Jackson

  • 添加依赖:
  • <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.6.5</version>
    </dependency>
    
  • 代码实现:
  • //读取 JSON 字符串
    JsonNode jsonNodeTree = new ObjectMapper().readTree(jsonStr);
    //转换成 YAML 字符串
    String yamlStr = new YAMLMapper().writeValueAsString(jsonNodeTree);
    
  • 效果展示:
  • kind: "Service" apiVersion: "v1" metadata: name: "tomcat" labels: app: "tomcat" spec: ports: - name: "tcp-8080" protocol: "TCP" port: 8080 selector: app: "tomcat"

    该方式会自动带上 --- 分隔符,大部分属性值也默认带上了双引号,若不想要引号,可使用下面的方式。

    二、使用 snakeyaml

  • 添加依赖:
  • <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.18</version>
    </dependency>
    
  • 代码实现:
  • Yaml yaml = new Yaml();
    //将 JSON 字符串转成 Map
    Map<String,Object> map = (Map<String, Object>) yaml.load(jsonUrl);
    //转换成 YAML 字符串
    String yamlStr = yaml.dumpAsMap(map);
    
  • 效果展示:
  • kind: Service
    apiVersion: v1
    metadata:
      name: tomcat
      labels:
        app: tomcat
    spec:
      ports:
      - name: tcp-8080
        protocol: TCP
        port: 8080
      selector:
        app: tomcat
    

    该方式先将 JSON 字符串转通过 load 方法转成 map,再转成 YAML 格式,效果上看比第一种方式要好。