Reputation: 937
I would like to deserialize a YAML file into a Java object using Jackson and jackson-dataformat-yaml.
The YAML is
company:
product:
settings:
property: value
The target class is
@Getter @Setter
public class TargetObject {
private Map<String, String> settings;
}
The code for deserializing is
TargetObject config =
new ObjectMapper(new YAMLFactory())
.readerFor(TargetObject.class)
.withRootName("company.product")
.readValue(yamlResource.getInputStream());
I get following exception when executing this code:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Root name ('company') does not match expected ('company.product') for type `a.b.c.TargetObject`
Without the second nesting "product" everything works. Is there any possibility to solve this issue without touching the YAML? I've read about escaping dots as YAML keys like "[company.product]"
, but sadly that is not an option in my use case.
Regards, Rokko
Upvotes: 2
Views: 1603
Reputation: 4547
You are very close to the solution, the problem stands in the fact you are using the wrong ObjectReader#withRootName
method in your code:
TargetObject config =
new ObjectMapper(new YAMLFactory())
.readerFor(TargetObject.class)
.withRootName("company.product") //<-- here the error
.readValue(yamlResource.getInputStream());
Instead you have to use the ObjectReader#at
method to select the yaml part you are interested with the appropriate "/company/product"
path to obtain the expected result:
TargetObject config =
new ObjectMapper(new YAMLFactory())
.readerFor(TargetObject.class)
.at("/company/product") //<--here the new method
.readValue(yamlResource.getInputStream());
Upvotes: 3