snakeyaml自定义pojo写入yml文件时属性字段排序问题

2023-05-16

    snakeyaml采用LinkedHashMap保存对象,最后写入yml文件的时候,可以按照存入的顺序写入yml,如果采用自定义pojo,虽然可以写入yml,但是属性默认是按照字母顺序进行写入的。

    如下所示,定义一个User实体,给定四个属性:id,name,age,email。

package com.yaml;
public class User {
    private int id;
    private String name;
    private int age;
    private String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

    保存

package com.yaml;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.nodes.Tag;

import java.io.StringWriter;

public class PojoWriteExample {
    public static void main(String[] args) {
        DumperOptions options = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        options.setIndentWithIndicator(true);
        options.setIndicatorIndent(2);
        Yaml yaml = new Yaml(options);
        User user = new User();
        user.setId(1);
        user.setName("buejee");
        user.setAge(18);
        user.setEmail("buejee@sina.com");
        StringWriter sw = new StringWriter();
        String res =  yaml.dumpAs(user, Tag.MAP, null);
        sw.append(res);
        sw.flush();
        System.out.println(res);
    }
}

    运行结果:

 

     这个自定义pojo,按照字母排序就有一点遗憾了,虽然结构不会有问题,而且最后解析也不会有问题,但是强迫症的人就受不了。

    如下所示,这是网上的一个解决办法。

 java - How to order nodes in YAML with SnakeYaml? - Stack Overflow

   大致意思是自定义一个Representer,修改PropertyUtils

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;

import org.yaml.snakeyaml.introspector.*;
import org.yaml.snakeyaml.nodes.*;
import org.yaml.snakeyaml.representer.Representer;

public class CustomRepresenter extends Representer {

  public CustomRepresenter() {
    super();
    PropertyUtils propUtil = new PropertyUtils() {
      @Override
      protected Set<Property> createPropertySet(Class<? extends Object> type, BeanAccess bAccess) {
        return getPropertiesMap(type, bAccess).values().stream().sequential()
            .filter(prop -> prop.isReadable() && (isAllowReadOnlyProperties() || prop.isWritable()))
            .collect(Collectors.toCollection(LinkedHashSet::new));
      }
    };
    setPropertyUtils(propUtil);
  }
}

    我们拷贝这个代码,加入我们的代码中:

CustomRepresenter customRepresenter = new CustomRepresenter();
Yaml yaml = new Yaml(customRepresenter, options);

     运行代码,结果如下:

 

    似乎没有改进,这是因为在修改PropertyUtils中,getPropertiesMap(type,bAccess)这个方法,最终得到的结果还是一个按照字母顺序排列的集合,需要让代码生效,我们需要改进。

getPropertiesMap(type, BeanAccess.FIELD)

    更改之后,再运行代码: 

    完美解决pojo写入yml时属性排序问题。 

    同样的,这个自定义Representer里面还可以添加其他生成器,比如空值,双引号生成器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

snakeyaml自定义pojo写入yml文件时属性字段排序问题 的相关文章

随机推荐

  • Maven项目引用本地jar涉及scope配置

    在项目开发过程中 xff0c 难免遇到需要引用私有jar的情况 xff0c 这时候最好是将该jar推送到私服仓库 xff0c 但是由于种种 现实问题 xff0c 比如权限不够 时间不够等等 于是就可以尝试将jar放入项目中进行集成 xff0
  • postgresql使用pg_basebackup备份与恢复

    postgresql可以使用pg dump pg restore等命令来进行备份与恢复 xff0c 那种情况不用停止pgsql服务 xff0c 只需要执行备份恢复命令即可 今天介绍的这种备份方式 xff0c 类似于文件系统的备份与恢复 xf
  • java中list与数组相互转换

    java中 xff0c list转数组 xff0c 很方便 xff0c list本身自带一个方法toArray xff0c 但是这个方法默认返回的数组类型是Object xff0c 我们可以给toArray 方法传递一个类型参数 xff0c
  • cython混淆加密

    python代码是一种解释型的语言 xff0c 有了代码和环境就可以执行 xff0c 它无需编译 如果需要对代码进行混淆 xff0c 可以借助cython这个库 它的安装很简单 xff0c 直接运行pip install cython就可以
  • python文件夹拷贝思路

    最近在做项目中 xff0c 要使用python xff0c 对文件拷贝有了一些了解 xff0c 这里将自己理解的文件拷贝整理出来 如下所示 xff0c 文件拷贝思路 xff1a 文件拷贝 xff0c 从io上来说就是读文件 xff0c 写文
  • node检测端口是否被占用isPortOccupied.js

    如题所示 xff0c node开发中 xff0c 可能会遇到开启tcp http服务端口被占用的问题 xff0c 解决起来也很简单 xff0c 直接换一个端口就可以了 但是每次启动 xff0c 发现失败 xff0c 然后更改监听端口来测试
  • commons-math3求解线性方程组

    python语言numpy scipy库可以实现矩阵求解线性方程组 xff0c 在java语言中 xff0c commons math3提供了强大的矩阵计算功能 xff0c 同样也可以用来解决线性方程组问题 如下所示 xff0c 线性方程组
  • 2022记忆

    今年开年来就重新找工作 xff0c 因为就在去年大概这个时候 xff0c 公司裁员了 找工作 xff0c 对于我们这种大龄程序员来说是一种挑战 xff0c 很多公司表面说可以聊聊 xff0c 最后谈了之后 xff0c 发现技术也可以 xff
  • java调用js示例

    jdk1 8引入了js引擎功能 xff0c 可以在命令行下运行js交互程序 xff1a 在jdk11之后 xff0c 这个功能又去掉了 如下代码 xff0c 是一个通过js调起计算器的示例 javascript代码 function mai
  • 查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

    如题所示 xff0c 这个问题是我在postgresql中使用pg dump备份多个schema的表时遇到的问题 bin pg dump dbname 61 postgresql dbuser 123456 64 localhost 543
  • 最小二乘法公式推导以及在线性回归中的应用

    机器学习算法中 xff0c 有一个基础的算法 xff0c 线性回归 xff0c 它的目的是求出一条直线 xff0c 满足所有点到这条直线的距离最短 xff0c 也就是这些数据点能够看起来都在这条直线附近 xff0c 最后 xff0c 可以根
  • Java根据经纬度获取地址信息

    使用高德API根据经纬度获取一定范围内的地址信息 PS xff1a 1 高德地图接口Key申请步骤 xff1a https zhuanlan zhihu com p 555130433 2 经纬度在线查询网址 xff1a https map
  • c++改变控制台显示颜色

    这个问题是别人问我怎么把控制台默认黑底白字修改掉的 xff0c 我说我以前做过java语言控制台颜色控制 xff0c c的没试过 后来还是留意了一下 xff0c 发现可以改变控制台显示颜色 如下实例 xff1a include 34 pch
  • springboot使用MultipartFile上传文件以及File与MultipartFile互转

    如下所示的代码 xff0c 是一个在springboot项目中使用MultipartFile进行文件上传的示例 xff1a package com springboot web import org springframework http
  • python之np.sum()用法详解

    python库numpy提供的求和方法np sum xff0c 可以对数组和矩阵进行求和 sum方法可以接收多个参数 xff0c 主要是数组a 坐标轴axis 数据类型dtype 初始值initial 其中 xff0c axis对于我们来说
  • java中list集合对象按照某一个属性分组

    这里的需求是分组 xff0c 就是集合按照相同的属性来分组 一般默认的做法就是定义一个对象 xff0c 然后利用java8流对象的分组方法来分组 xff0c 在分组函数中 xff0c 传入一个属性get方法 如下所示 xff1a packa
  • snakeyaml数字字符串显示单引号的问题

    如题所示 xff0c 一般yaml结构中 xff0c 字符串直接显示没有单引号的字符串 xff0c 如果字符串由数字组成 xff0c 为了区别真正的数字 xff0c 这个字符串会使用单引号包围起来 数据结构如下 xff1a Map lt S
  • java中flatMap用法

    java中map是把集合每个元素重新映射 xff0c 元素个数不变 xff0c 但是元素值发生了变化 而flatMap从字面上来说是压平这个映射 xff0c 实际作用就是将每个元素进行一个一对多的拆分 xff0c 细分成更小的单元 xff0
  • excel中设置下拉选择框和word文档中插入外部excel只显示图标

    这篇文章介绍两个和excel相关的主题 xff0c 一个是对excel表格设置下拉框 xff0c 另一个是在word文档中插入外部excel xff0c 但是我们不想展示excel的内容 xff0c 而是展示一个图标 xff0c 点击图标
  • snakeyaml自定义pojo写入yml文件时属性字段排序问题

    snakeyaml采用LinkedHashMap保存对象 xff0c 最后写入yml文件的时候 xff0c 可以按照存入的顺序写入yml xff0c 如果采用自定义pojo xff0c 虽然可以写入yml xff0c 但是属性默认是按照字母