I am new to YAML and have parse a YAML config file that looks like:
applications:
authentication:
service-version: 2.0
service-url: https://myapp.corp/auth
app-env: DEV
timeout-in-ms: 5000
enable-log: true
service1:
enable-log: true
auth-required: true
app-env: DEV
timeout-in-ms: 5000
service-url: https://myapp.corp/service1
service-name: SomeService1
service-version: 1.1
service-namespace: http://myapp.corp/ns/service1
service2:
enable-log: true
auth-required: true
app-env: DEV
timeout-in-ms: 5000
service-url: https://myapp.corp/service2
service-name: SomeService2
service-version: 2.0
service-namespace: http://myapp.corp/ns/service2
I have to parse to following Map
structure
+==================================+
| Key | |
+==================================+
| authentication | AuthConfig |
+----------------------------------+
| service1 | ServiceConfig |
+----------------------------------+
| service2 | ServiceConfig |
+----------------------------------+
AuthConfig
and ServiceConfig
are the custom objects in our system.
Can someone provide some hints how to do it?
If your key is loginUrl (inside your yaml file), you can inject its value with the @Value annotation, inside a Spring component. @Value("${loginUrl}") private String loginUrl; If it's a second level property, the path is @Value("${yourFirstKey. loginUrl}") .
We can read the YAML file using the PyYAML module's yaml. load() function. This function parse and converts a YAML object to a Python dictionary ( dict object). This process is known as Deserializing YAML into a Python.
Read YAML File as Map in Java The Yaml instance introduces us to methods, such as load() which allow us to read and parse any InputStream , Reader or String with valid YAML data: InputStream inputStream = new FileInputStream(new File("student. yml")); Yaml yaml = new Yaml(); Map<String, Object> data = yaml.
There is a package for Java called Jackson that handles mapping between YAML (and JSON, and CSV, and XML) and Java objects. Most examples you will come across are for JSON, but the YAML link shows that switching is straight-forward. Everything goes through an ObjectMapper
:
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
That can then be used to deserialize your object via reflection:
ApplicationCatalog catalog = mapper.readValue(yamlSource, ApplicationCatalog.class);
You would set up your classes something like this (I've made everything public for ease of example):
class ApplicationCatalog {
public AuthConfig authentication;
public ServiceConfig service1;
public ServiceConfig service2;
}
class AuthConfig {
@JsonProperty("service-version")
public String serviceVersion;
@JsonProperty("service-url")
public String serviceUrl;
@JsonProperty("app-env")
public String appEnv;
@JsonProperty("timeout-in-ms")
public int timeoutInMs;
@JsonProperty("enable-log")
public boolean enableLog;
}
class ServiceConfig {
...
}
Notice the JsonProperty annotation which is renaming your Java field to YAML field. I find this the most convenient way of dealing with JSON and YAML in Java. I've also had to use the streaming API for really large objects.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With