如何实现Jackson YAML序列化时部分字段带引号部分不带?
解决Jackson YAML序列化部分字段带引号、部分不带的问题
要实现你需要的混合格式效果,核心是针对需要带引号的字段单独控制序列化行为,全局的MINIMIZE_QUOTES设置保持开启即可。下面是具体实现步骤:
方法:自定义字段序列化器
给需要强制带引号的字段指定一个自定义序列化器,临时关闭该字段序列化时的MINIMIZE_QUOTES特性,完成写入后再恢复全局设置,不影响其他字段。
1. 实现带引号的字符串序列化器
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; import java.io.IOException; public class QuotedStringSerializer extends StdSerializer<String> { public QuotedStringSerializer() { super(String.class); } @Override public void serialize(String value, JsonGenerator gen, SerializerProvider provider) throws IOException { if (gen instanceof YAMLGenerator) { YAMLGenerator yamlGen = (YAMLGenerator) gen; // 保存全局MINIMIZE_QUOTES的原始状态 boolean originalMinimizeState = yamlGen.isEnabled(YAMLGenerator.Feature.MINIMIZE_QUOTES); try { // 临时关闭该字段的引号最小化,强制输出引号 yamlGen.disable(YAMLGenerator.Feature.MINIMIZE_QUOTES); yamlGen.writeString(value); } finally { // 恢复全局设置,避免影响其他字段 if (originalMinimizeState) { yamlGen.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES); } } } else { // 非YAML序列化场景,按默认逻辑处理 gen.writeString(value); } } }
2. 在实体类中指定字段使用自定义序列化器
给需要带引号的字段加上@JsonSerialize注解,指定使用上面的序列化器:
public class Employee { // 该字段强制带引号输出 @JsonSerialize(using = QuotedStringSerializer.class) private String name; // 该字段沿用全局MINIMIZE_QUOTES设置,无引号输出 private String department; // 构造器、Getter、Setter方法省略 }
3. 执行序列化(保持全局MINIMIZE_QUOTES开启)
ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)); Employee emp = new Employee("John", "Finance"); String yamlOutput = yamlMapper.writeValueAsString(emp); System.out.println(yamlOutput);
最终输出结果
name: "John" department: Finance
内容的提问来源于stack exchange,提问作者sandeepn09
相关产品推荐
相关产品推荐

