如何通过Enviroment对象解析yaml中的map对象

希望获取类似下面配置的student这个map

class:
  student:
    name:bob
    number:12213550
    gender:male

通过@ConfigurationProperties可以正常加载这种结构的map,但是通过Enviroment.getProperties()却只能获取到null。网上看到它们底层还都是一样的,是真的吗?

如何过Enviroment.getProperties()获取到yml中配置的map结构数据呢?

尝试过使用TypeReference,但是公司的SpringBoot版本比较低没有这个类。

参考GPT和自己的思路:关于如何通过Enviroment对象解析yaml中的map对象,其实是可以的。Enviroment对象提供了一个getProperty方法,参数是字符串类型的key,返回值是Object类型的value。在yaml中,map类型的数据对应的就是一个Object对象,所以我们可以通过getProperty方法得到这个Object对象,接着使用强制类型转换即可得到具体的map对象。具体的代码如下:

Map<String, Map<String, Object>> map = (Map<String, Map<String, Object>>) env.getProperty("class.student");

这段代码的作用是获取名为"student"的map对象。需要注意的是,在yaml文件中,这个map对象是属于"class"这个对象下面的一级对象,所以在getProperty方法中,需要使用"class.student"这个字符串作为key。

至于为什么@ConfigurationProperties可以正常加载这种结构的map而Enviroment.getProperties()却只能获取到null的问题,可能是因为@ConfigurationProperties内部使用了一些特定的解析方式来识别map类型的数据,而Enviroment.getProperties()只是简单的返回yaml文件中的Object对象,需要我们手动进行一些处理。但是具体的原因还需要进一步的了解和验证。

参考GPT和自己的思路:Enviroment.getProperties()方法是用来获取系统环境变量和Java系统属性的,无法直接获取yaml中的map对象数据。如果需要获取yaml中的map对象数据,需要借助其他工具类来进行解析,比如使用SnakeYaml库。具体实现可以参照以下代码:

import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.Map;

public class YamlUtils {
    public static Map<String, Object> getYamlMap(String yamlPath) {
        Yaml yaml = new Yaml();
        InputStream inputStream = YamlUtils.class.getClassLoader().getResourceAsStream(yamlPath);
        Map<String, Object> obj = yaml.load(inputStream);
        return obj;
    }
}

在代码中,我们使用Yaml库的load方法来读取yaml文件,并将读取到的map对象返回。其中,yamlPath参数需要根据实际情况进行修改。

使用以上代码可以解决问题。同时,对于低版本的SpringBoot,可以自行添加snakeyaml库来实现类似的功能。