On Mon, Mar 18, 2019 at 7:28 PM Jan Bernitt <[email protected]> wrote:
>
> Hi,
>
> given this model:
>
> interface A<T> extends Map<String, T> {
>
>   Map<String, Object> getExtensions();
>
>   String getX();
>
>   void setX(String x);
> }
>
> class Foo extends A<Bar> { }
> class Bar { }
>
> Filling it with data:
>
> Foo foo = new Foo();
> foo.put("bar", new Bar()); // using it as Map
> foo.setX("y");
> foo.getExtension().put("ext", "ext-value");
>
> I want this JSON generated:
>
> {
>   "bar": {
>     // bar's properties
>   },
>   "x": "y" ,
>   "ext": "ext-value"
> }
>
> So the extensions Map is flattened into the same object as the extended map. 
> And properties like `x` are included as well.
>
> This has proven hard to configure.
> Treating it as bean would require two usages of @JsonAnyGetter (extended and 
> extension map).
> Treating it as map ignores the other properties.
> Using custom serializers would need to delegate to a map and a bean 
> serializer as it would be used if I would not configure a custom serializer. 
> I failed to do this so far.
>
> Any suggestion is welcome.

I think you covered all available options, and I can't think of
others. About the only note I'll make is that it is not possible to
annotate more than one accessor with `@JsonAnyGetter`: it will not
work and may (should) throw an exception to indicate problem.

What I would probably due would be to treat is as POJO (with
@JsonFormat(shape = Shape.POJO)), and then define custom accessor to
annotate with `@JsonAnyGetter`: one that would combine `extensions`
with entries of `Map` itself.

-+Tatu +-

-- 
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.

Reply via email to