/
JsonUnwrapped.java
96 lines (92 loc) · 3 KB
/
JsonUnwrapped.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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 <b>POJO-valued</b> property should be
* serialized "unwrapped" -- that is, if it would be serialized as Object value,
* its properties are instead included as properties of its containing
* Object -- and deserialized reproducing "missing" structure.
* 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 {@code @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.
* When values are deserialized "wrapping" is applied so that serialized output can
* be read back in.
*<p>
* Also note that annotation only applies if:
*<ul>
* <li>Value is serialized as an Object value (can not unwrap Array values using this
* mechanism)
* </li>
* <li>Reading/writing is done using Jackson standard {@code BeanDeserializer} /
* {@code BeanSerializer}; or custom deserializer/serializer MUST explicitly
* support similar operation.
* </li>
* <li>Will not work with polymorphic type handling ("polymorphic deserialization")
* </li>
* </ul>
* Specifically note that this annotation WILL NOT WORK for structured types like
* {@link java.util.Map}s or {@code JsonNode}s: for these types you will
* instead need to use {@link JsonAnyGetter} and {@link JsonAnySetter} to achieve
* similar operation.
*/
@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.
*/
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.
*/
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.
*/
String suffix() default "";
}