package com.fasterxml.jackson.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
Annotation used to indicate that a property should be serialized
"unwrapped"; that is, if it would be serialized as JSON Object, its
properties are instead included as properties of its containing
Object. For example, consider case of POJO like:
public class Parent {
public int age;
public Name name;
}
public class Name {
public String first, last;
}
which would normally be serialized as follows (assuming @JsonUnwrapped
had no effect):
{
"age" : 18,
"name" : {
"first" : "Joey",
"last" : "Sixpack"
}
}
can be changed to this:
{
"age" : 18,
"first" : "Joey",
"last" : "Sixpack"
}
by changing Parent class to:
public class Parent {
public int age;
@JsonUnwrapped
public Name name;
}
Annotation can only be added to properties, and not classes, as it is contextual.
Also note that annotation only applies if
- Value is serialized as JSON Object (can not unwrap JSON arrays using this
mechanism)
- Serialization is done using
BeanSerializer
, not a custom serializer
- No type information is added; if type information needs to be added, structure can
not be altered regardless of inclusion strategy; so annotation is basically ignored.
/**
* Annotation used to indicate that a property should be serialized
* "unwrapped"; that is, if it would be serialized as JSON Object, its
* properties are instead included as properties of its containing
* Object. For example, consider case of POJO like:
*
*<pre>
* public class Parent {
* public int age;
* public Name name;
* }
* public class Name {
* public String first, last;
* }
*</pre>
* which would normally be serialized as follows (assuming @JsonUnwrapped
* had no effect):
*<pre>
* {
* "age" : 18,
* "name" : {
* "first" : "Joey",
* "last" : "Sixpack"
* }
* }
*</pre>
* can be changed to this:
*<pre>
* {
* "age" : 18,
* "first" : "Joey",
* "last" : "Sixpack"
* }
*</pre>
* by changing Parent class to:
*<pre>
* public class Parent {
* public int age;
* @JsonUnwrapped
* public Name name;
* }
*</pre>
* Annotation can only be added to properties, and not classes, as it is contextual.
*<p>
* Also note that annotation only applies if
*<ul>
* <li>Value is serialized as JSON Object (can not unwrap JSON arrays using this
* mechanism)
* </li>
* <li>Serialization is done using <code>BeanSerializer</code>, not a custom serializer
* </li>
* <li>No type information is added; if type information needs to be added, structure can
* not be altered regardless of inclusion strategy; so annotation is basically ignored.
* </li>
* </ul>
*/
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonUnwrapped
{
Property that is usually only used when overriding (masking) annotations,
using mix-in annotations. Otherwise default value of 'true' is fine, and
value need not be explicitly included.
/**
* Property that is usually only used when overriding (masking) annotations,
* using mix-in annotations. Otherwise default value of 'true' is fine, and
* value need not be explicitly included.
*/
boolean enabled() default true;
Optional property that can be used to add prefix String to use in front
of names of properties that are unwrapped: this can be done for example to prevent
name collisions.
/**
* Optional property that can be used to add prefix String to use in front
* of names of properties that are unwrapped: this can be done for example to prevent
* name collisions.
*/
String prefix() default "";
Optional property that can be used to add suffix String to append at the end
of names of properties that are unwrapped: this can be done for example to prevent
name collisions.
/**
* Optional property that can be used to add suffix String to append at the end
* of names of properties that are unwrapped: this can be done for example to prevent
* name collisions.
*/
String suffix() default "";
}