On Sun, Apr 15, 2018 at 11:01 AM, Marcel Overdijk <mar...@overdijk.me> wrote:
> Hi,
>
> Is it possible to access the `objectMapper` from a custom `JsonSerializer`?
>
> Imagine a serializer like:
>
>
>     class JsonapiDocumentSerializer :
> StdSerializer<JsonapiDocument>(JsonapiDocument::class.java) {
>
>         @Throws(IOException::class)
>         override fun serialize(jsonapiDocument: JsonapiDocument, json:
> JsonGenerator, provider: SerializerProvider) {
>
>             json.writeStartObject()
>
>             // Would like to do something like:
>             val dataJson: ObjectNode =
> objectMapper.valueToTree(jsonapiDocument.data)
>
>             // And then manipulate the dataJson like:
>             // - removing fields
>             // - extract particular nodes and add them to an included
> `ArrayNode`
>             val includedJson = ArrayNode // create `ArrayNode` (how to
> create it from JsonSerializer?) and add data from dataJson
>
>             json.writeObjectField("data", dataJson)
>             json.writeObjectField("included", includedJson)
>
>             // Do other stuff:
>             jsonapiDocument.meta?.let { json.writeObjectField("meta", it) }
>             jsonapiDocument.jsonapi?.let { json.writeObjectField("jsonapi",
> it) }
>             jsonapiDocument.links?.let { json.writeObjectField("links", it)
> }
>
>             json.writeEndObject()
>         }
>     }
>
> I would like to call the objectMapper valueToTree, manipulate the data and
> the write it in the object.

No, serializers do not have back-references to `ObjectMapper`. Closes
thing is `SerializerProvider`,
context object which has access to serialization-side functionality of
mapper. But that does not, unfortunately,
include parts you would need for conversion.

I think, however, that `SerializerProvider` does have enough
functionality to handle this case since what you need
is ability to serialize value as a tree; then you can manipulate tree;
and then further get serializer to write out tree.

But the tricky part is that since you overriding default POJO
serializer for type, there would be no way to find original
any more. Except.... if you register `BeanSerializerModifier` (via
Module), override `modifySerializer()`, you can store
reference to POJO serializer, create your own wrapper. To use that
serializer you will need a `JsonGenerator`, and for
conversion, `TokenBuffer` is used as it extends `JsonGenerator`, and
can later on provide `JsonParser` for contents.
And finally, to serialize a `JsonNode`, you'd need to call
`SerializerProvider` to find standard serializer (or cheat and
create one yourself).

Another possibly simpler approach would be to see if Converters would
work: both `@JsonSerialize` and `@JsonDeserialize`
allow specifying `converter` property. What that gives is it lets you
inject converter that starts with custom type (for serialization),
and lets you massage value into different value of different type
(usually, although may be same type), and then apply
default serialization.

I hope this helps,

-+ 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 jackson-user+unsubscr...@googlegroups.com.
To post to this group, send email to jackson-user@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to