YAML 字符串对比合并:Java8 代码实现
要实现对比并合并两个yaml字符串,可以使用YAML库来解析和处理yaml格式的数据。以下是使用SnakeYAML库来实现的示例代码:
import org.yaml.snakeyaml.Yaml;
import java.util.HashMap;
import java.util.Map;
public class YamlMerger {
public static void main(String[] args) {
String yamlString1 = "deploy:\n" +
" url: 123456@.qq.com\n" +
" name: 123456\n" +
"swagger:\n" +
" enabled: ${swaggerEnabled:false}";
String yamlString2 = "server:\n" +
" port: 50012\n" +
" tomcat:\n" +
" uri-encoding: UTF-8\n" +
" servlet:\n" +
" context-path: /api/ts-dc\n" +
"spring:\n" +
" profiles:\n" +
" active:\n" +
" - ${profileName:prod}\n" +
" servlet:\n" +
" multipart:\n" +
" max-file-size: 100MB\n" +
" max-request-size: 100MB\n" +
" ######################################mysql基础数据库-需要修改链接 start################################################\n" +
" datasource:\n" +
" type: com.alibaba.druid.pool.DruidDataSource\n" +
" driver-class-name: com.mysql.jdbc.Driver\n" +
" url: jdbc:mysql://${mysqlIp:172.17.0.1}:${mysqlPort:3306}/ly_dc?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai\n" +
" username: ${mysqlUsername:root}\n" +
" password: ${mysqlPassword:Ly37621040}\n" +
" druid:\n" +
" initial-size: 5\n" +
" min-idle: 5\n" +
" max-active: 20\n" +
" max-wait: 60000\n" +
" pool-prepared-statements: false\n" +
" max-pool-prepared-statement-per-connection-size: 20\n" +
" max-open-prepared-statements: 20\n" +
" validation-query: SELECT 'x' from dual\n" +
" validation-query-timeout: 30000\n" +
" test-on-borrow: true\n" +
" test-on-return: false\n" +
" test-while-idle: true\n" +
" time-between-eviction-runs-millis: 60000\n" +
" min-evictable-idle-time-millis: 300000\n" +
" max-evictable-idle-time-millis: 300000\n" +
" filters: stat,wall,log4j\n" +
" filter:\n" +
" wall:\n" +
" enabled: true\n" +
" config:\n" +
" comment-allow: true\n" +
" multi-statement-allow: true\n" +
" web-stat-filter:\n" +
" enabled: true #是否启用StatFilter默认值true\n" +
" url-pattern: /druid/*\n" +
" session-stat-enable: true\n" +
" session-stat-max-count: 10\n" +
" principal-session-name:\n" +
" principal-cookie-name:\n" +
" profile-enable: true\n" +
" stat-view-servlet:\n" +
" enabled: true #是否启用StatViewServlet默认值true\n" +
" url-pattern: /druid/*\n" +
" reset-enable: true\n" +
" login-username: admin\n" +
" login-password: Ly37621040\n" +
" allow:\n" +
" deny:\n" +
" ######################################mysql基础数据库-需要修改链接 end################################################\n" +
" ##########################################redis-需要修改链接 start ##############################################\n" +
" redis:\n" +
" database: 1 # Redis数据库索引(默认为0)\n" +
" host: ${redisIp:172.17.0.1} # Redis服务器地址\n" +
" port: 16377 # Redis服务器连接端口\n" +
" password: 37621040 #Redis服务器连接密码(默认为空)\n" +
" timeout: 0 # 连接超时时间(毫秒)\n" +
" jedis:\n" +
" pool:\n" +
" max-idle: 8 # 连接池中的最大空闲连接\n" +
" min-idle: 1 # 连接池中的最小空闲连接\n" +
" max-active: 8 # 连接池最大连接数(使用负值表示没有限制)\n" +
" max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)\n" +
" ##########################################redis-需要修改链接 end ##############################################\n" +
" ##########################################rabbitmq-需要修改链接 start ##############################################\n" +
" rabbitmq:\n" +
" host: ${rabbitmqIp:172.17.0.1}\n" +
" port: 5672\n" +
" username: admin\n" +
" password: 37621040\n" +
" ##########################################rabbitmq-需要修改链接 end ##############################################\n" +
" flyway:\n" +
" enabled: true\n" +
" baseline-on-migrate: true\n" +
" clean-on-validation-error: true\n" +
" validate-on-migrate: false\n" +
" encoding: UTF-8\n" +
" locations: classpath:db/migration\n" +
" sql-migration-prefix: V\n" +
" sql-migration-separator: __\n" +
" sql-migration-suffixes: .sql\n" +
" ##########################################quartz-需要修改链接(与基础库一样) start ##############################################\n" +
" quartz:\n" +
" properties:\n" +
" org:\n" +
" quartz:\n" +
" dataSource:\n" +
" qzDS:\n" +
" URL: ${spring.datasource.url}\n" +
" driver: ${spring.datasource.driver-class-name}\n" +
" maxConnections: 10\n" +
" password: ${spring.datasource.password}\n" +
" user: ${spring.datasource.username}\n" +
" jobStore:\n" +
" class: org.quartz.impl.jdbcjobstore.JobStoreTX\n" +
" dataSource: qzDS\n" +
" driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n" +
" misfireThreshold: 5000\n" +
" tablePrefix: LY_QRTZ_\n" +
" useProperties: false\n" +
" scheduler:\n" +
" instanceName: ly_ts_scheduler\n" +
" threadPool:\n" +
" class: org.quartz.simpl.SimpleThreadPool\n" +
" makeThreadsDaemons: true\n" +
" threadCount: 10\n" +
" threadPriority: 5\n" +
" threadsInheritContextClassLoaderOfInitializingThread: true\n" +
" ##########################################quartz-需要修改链接(与基础库一样) end ##############################################\n" +
" ##########################################liboffice-需要修改链接start ##############################################\n" +
"openoffice:\n" +
" host: ${libofficeIp:172.17.0.1}\n" +
" port: 8100\n" +
"##########################################openoffice-需要修改链接end ##############################################\n" +
"##########################################elasticsearch-需要修改链接start ##############################################\n" +
"elasticsearch:\n" +
" host: ${elasticsearchIp:172.17.0.1}\n" +
" port: 9200\n" +
" username: elastic\n" +
" password: changeme\n" +
"##########################################elasticsearch-需要修改链接start ##############################################
" +
"#挂载文件路径\n" +
"fileClientPath: data/dc\n" +
"mybatis-plus:\n" +
" mapper-locations: classpath:/mapper/**/*Mapper.xml\n" +
" typeAliasesPackage: com.ly.cloud.**.po\n" +
" global-config:\n" +
" #驼峰下划线转换\n" +
" db-config:\n" +
" id-type: ID_WORKER\n" +
" banner: false\n" +
" configuration:\n" +
" map-underscore-to-camel-case: true\n" +
" cache-enabled: false\n" +
" log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n" +
"feign:\n" +
" hystrix:\n" +
" enabled: true\n" +
"#队列名称\n" +
"queueName: queue_1\n" +
"#邮件发送参数\n" +
"mail:\n" +
" smtp:\n" +
" host: smtp.qq.com\n" +
" port: 465\n" +
" auth: true\n" +
" ssl:\n" +
" enable: true\n" +
" debug: true\n" +
" transport:\n" +
" protocol: smtp\n" +
" #邮件发送者账号(如需更改请打开注释)\n" +
" #formMailUser: xxx@ly-sky.com\n" +
" #smtp客户端密码\n" +
" #smtpPassword: xxx\n" +
" #邮件发送者密码\n" +
" #formMailPassword: xxx\n" +
"auth:\n" +
" captchaOnOff: false\n" +
" token:\n" +
" # 令牌自定义标识\n" +
" header: Authorization\n" +
" # 令牌密钥\n" +
" secret: abcdefghijklmnopqrstuvwxyz\n" +
" # 令牌有效期(默认30分钟)\n" +
" expireTime: ${expireTime:120}\n" +
"swagger:\n" +
" # 是否开启swagger\n" +
" enabled: ${swaggerEnabled:false}\n" +
"#联奕运维机器人\n" +
"ding:\n" +
" #开发者后台->应用开发-企业内部应用->选择您的机器人->应用凭证->AppKey\n" +
" app-key: dingpmhdlmis9n1eudpq\n" +
" #开发者后台->应用开发-企业内部应用->选择您的机器人->应用凭证->AppSecret\n" +
" app-secret: W3N8pOHvwcdC6NBtKUs00dQEJFumaijLFDBysiAQoEJ76d7VCz_XGWZvxIEWSp9p\n" +
" #群聊->机器人头像->机器人设置(有权限,不一定都能看到)->Webhook\n" +
" webhook: https://oapi.dingtalk.com/robot/send?access_token=5e5b46416e86a36c3c82ec21ead12df820273316f332aa366928044d29d23ed4";
Yaml yaml = new Yaml();
Map<String, Object> yamlMap1 = yaml.load(yamlString1);
Map<String, Object> yamlMap2 = yaml.load(yamlString2);
// 对比并合并两个 YAML 字符串
yamlMap2.putAll(yamlMap1);
// 输出合并后的 YAML 字符串
System.out.println(yaml.dump(yamlMap2));
}
}
代码解释:
- 使用
Yaml库解析两个 YAML 字符串并将其转换为Map对象。 - 使用
putAll()方法将第一个 YAML 字符串中的内容合并到第二个 YAML 字符串中。 - 使用
dump()方法将合并后的Map对象转换为 YAML 字符串并输出。
注意:
- 此代码使用 SnakeYAML 库。如果使用其他 YAML 库,可能需要调整代码。
- 由于 YAML 字符串中的注释可能与键值对有换行符,所以需要使用
\n转义换行符。 - 此代码使用
putAll()方法进行合并,如果两个 YAML 字符串中存在相同键,则会覆盖第二个 YAML 字符串中的值。
通过以上代码,您可以成功对比并合并两个 YAML 字符串,并保留注释。
原文地址: http://www.cveoy.top/t/topic/qeI9 著作权归作者所有。请勿转载和采集!