I realize for completeness I should also include the code I'm running to
deserialize, though I'm sure this will surprise nobody:
new ObjectMapper(new YAMLFactory()).readValue(new File(
"/path/to/myfile.yaml"), YamlScratch.class);
On Tuesday, February 12, 2019 at 4:18:39 PM UTC-5, John Passaro wrote:
>
> Hello folks! I am trying to deserialize a yaml file with anchors and
> references. There are some existing StackOverflow questions along these
> lines but the answers aren't quite getting me to the finish line.
>
> Here is my model:
>
> @JsonIdentityInfo(generator = ObjectIdGenerators.None.class)
> class YamlScratch {
> @JsonProperty("misc")
> List<List<String>> misc;
>
> @JsonProperty("contents")
> Map<String, Config> contents;
>
> static class Config {
> @JsonProperty("header")
> String header;
>
> @JsonProperty("labels")
> @JsonIdentityInfo(generator = ObjectIdGenerators.None.class)
> List<String> labels;
> }
> }
>
>
>
> Here is my YAML:
>
> misc:
> - &letters
> - Aie
> - Bee
> - See
> - &numbers
> - One
> - Two
> - Three
>
> contents:
> letters:
> header: "This is a list of phonetic letters"
> labels: *letters
> numbers:
> header: "This is a list of number spellings"
> labels: *numbers
> moreletters:
> header: "this is another copy of the letters"
> labels: *letters
>
>
> The idea is that I have lists that may be referenced more than once in the
> "contents" tree, and I'd like to be able to reference them concisely.
>
> I've tried to enable this in my Java code by adding @JsonIdentityInfo to
> the "labels" field that will reference these lists. As for the YAML, I
> added "&..." anchors to the data that will be referenced, and where it
> should appear I added "*..." references. PyYAML seems to confirm this is
> the correct YAML usage:
>
> $ python3
> >>> import yaml
> >>> f = open(
> "/Users/johnpassaro/Library/Preferences/IdeaIC2018.3/scratches/scratch.yml"
> )
> >>> y = yaml.load(f)
> >>> y
> {'misc': [['Aie', 'Bee', 'See'], ['One', 'Two', 'Three']], 'contents': {
> 'letters': {'header': 'This is a list of phonetic letters', 'labels': [
> 'Aie', 'Bee', 'See']}, 'numbers': {'header': 'This is a list of number
> spellings', 'labels': ['One', 'Two', 'Three']}}}
>
>
> With Jackson (2.9), I get an error:
>
> Exception in thread "main"
> com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot
> deserialize instance of java.util.ArrayList out of VALUE_STRING token
> at [Source: (File); line: 14, column: 13] (through reference chain:
> YamlScratch["contents"]->java.util.LinkedHashMap["letters"]->YamlScratch$Config["labels"])
>
> I tried changing
> List<String> labels;
> to
> Object labels;
> just to see how Jackson was treating it: instead of resolving the anchor
> reference ("*letters"), it just returns the reference name as as a string
> ("letters").
>
> One of the StackOverflow questions has an answer
> <https://stackoverflow.com/a/40115377/3229874> that mentions the feature
> YAMLParser.Feature.USE_NATIVE_OBJECT_ID. That would seem to be exactly
> what I need, but that enum value is not present in 2.9.
>
> Is this behavior supported at all? If so, what do I need to do to make it
> work?
>
> Many thanks in advance for your help. I'd be happy to post the results on
> the relevant SO threads to make sure this information get shared reasonably
> widely.
>
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.