Skip to content

Commit a348233

Browse files
authored
Merge pull request #45 from SentryMan/main
Add Json Alias annotation
2 parents b9f353e + a090eba commit a348233

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.avaje.jsonb.generator;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
6+
import javax.lang.model.element.AnnotationMirror;
7+
import javax.lang.model.element.Element;
8+
9+
final class AliasReader {
10+
private AliasReader() {}
11+
12+
private static final String JSON_ALIAS = "io.avaje.jsonb.Json.JsonAlias";
13+
14+
/** Read the Json.Alias annotation using annotation mirrors. */
15+
static List<String> getAliases(Element element) {
16+
for (final AnnotationMirror mirror : element.getAnnotationMirrors()) {
17+
if (JSON_ALIAS.equals(mirror.getAnnotationType().toString())) {
18+
return mirror.getElementValues().values().stream()
19+
.flatMap(v -> ((List<?>) v.getValue()).stream())
20+
.map(Object::toString)
21+
.map(Util::trimQuotes)
22+
.collect(Collectors.toList());
23+
}
24+
}
25+
return null;
26+
}
27+
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class FieldReader {
3131
private boolean constructorParam;
3232
private boolean genericTypeParameter;
3333
private int genericTypeParamPosition;
34+
private final List<String> aliases;
3435

3536
FieldReader(Element element, NamingConvention namingConvention, TypeSubTypeMeta subType, List<String> genericTypeParams) {
3637
addSubType(subType);
@@ -39,6 +40,7 @@ class FieldReader {
3940
this.propertyName = PropertyReader.name(namingConvention, fieldName, element);
4041
this.publicField = element.getModifiers().contains(Modifier.PUBLIC);
4142
this.rawType = trimAnnotations(element.asType().toString());
43+
this.aliases = AliasReader.getAliases(element);
4244

4345
final PropertyIgnoreReader ignoreReader = new PropertyIgnoreReader(element);
4446
this.unmapped = ignoreReader.unmapped();
@@ -302,6 +304,15 @@ void writeFromJsonSwitch(Append writer, boolean defaultConstructor, String varNa
302304
if (unmapped) {
303305
return;
304306
}
307+
308+
if (aliases != null) {
309+
310+
for (final String alias : aliases) {
311+
writer.append(" case \"%s\":", alias);
312+
writer.eol();
313+
}
314+
}
315+
305316
writer.append(" case \"%s\": {", propertyName).eol();
306317
if (!deserialize) {
307318
writer.append(" reader.skipValue();");

jsonb-generator/src/test/java/io/avaje/jsonb/generator/models/valid/TestClass.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
@Json
88
public class TestClass {
99

10+
@Json.JsonAlias({"something", "something2"})
11+
private String alias;
12+
1013
private String s;
1114

1215
private int i;
@@ -19,6 +22,13 @@ public class TestClass {
1922

2023
private List<String> list;
2124

25+
public String getAlias() {
26+
return alias;
27+
}
28+
29+
public void setAlias(String alias) {
30+
this.alias = alias;
31+
}
2232

2333
public String getS() {
2434
return s;

jsonb/src/main/java/io/avaje/jsonb/Json.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,24 @@
9191
String value();
9292
}
9393

94+
/**
95+
* Define one or more alternative names for a property accepted
96+
* during deserialization.
97+
*
98+
* <pre>{@code
99+
* @Json.JsonAlias("$code")
100+
* String referenceCode;
101+
*
102+
* }</pre>
103+
*/
104+
@Retention(CLASS)
105+
@Target({ElementType.FIELD})
106+
@interface JsonAlias {
107+
108+
/** One or more secondary names to accept as aliases to the official name. */
109+
String[] value();
110+
}
111+
94112
/**
95113
* Exclude the property from serialization, deserialization or both.
96114
* <p>

0 commit comments

Comments
 (0)