Added javadoc comment in JsonAdapter explaining the usage for fields.
Added a (broken) test the ensure a field annotation for JsonAdapter supersedes a class annotation.
This commit is contained in:
parent
f88eee094c
commit
67af0dd8f8
@ -22,6 +22,8 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
import com.google.gson.TypeAdapter;
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.functional.JsonAdapterAnnotationOnFieldsTest.Part;
|
||||||
|
import com.google.gson.functional.JsonAdapterAnnotationOnFieldsTest.PartJsonAdapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An annotation that indicates the Gson {@link TypeAdapter} to use with a class or a field.
|
* An annotation that indicates the Gson {@link TypeAdapter} to use with a class or a field.
|
||||||
@ -59,11 +61,24 @@ import com.google.gson.TypeAdapter;
|
|||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Since User class specified UserJsonAdapter.class in @JsonAdapter annotation, it
|
* Since User class specified UserJsonAdapter.class in @JsonAdapter annotation, it
|
||||||
* will automatically be invoked to serialize/deserialize User instances.
|
* will automatically be invoked to serialize/deserialize User instances. <br>
|
||||||
*
|
*
|
||||||
* If the UserJsonAdapter needs a constructor other than a no-args constructor, you must register
|
* If the UserJsonAdapter needs a constructor other than a no-args constructor, you must register
|
||||||
* an {@link com.google.gson.InstanceCreator} for it.
|
* an {@link com.google.gson.InstanceCreator} for it.
|
||||||
*
|
*
|
||||||
|
* <p> Here is an example of how to apply this annotation to a field.
|
||||||
|
* <pre>
|
||||||
|
* private static final class Gadget {
|
||||||
|
* @JsonAdapter(UserJsonAdapter2.class)
|
||||||
|
* final User user;
|
||||||
|
* Gadget(User user) {
|
||||||
|
* this.user = user;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
* The above annotation will ensure UserJsonAdapter2 supersedes UserJsonAdapter for the user
|
||||||
|
* field of the Gadget class.
|
||||||
|
*
|
||||||
* @since 2.3
|
* @since 2.3
|
||||||
*
|
*
|
||||||
* @author Inderjeet Singh
|
* @author Inderjeet Singh
|
||||||
|
@ -43,7 +43,7 @@ public final class JsonAdapterAnnotationOnFieldsTest extends TestCase {
|
|||||||
public void testRegisteredTypeAdapterOverridesFieldAnnotation() {
|
public void testRegisteredTypeAdapterOverridesFieldAnnotation() {
|
||||||
Gson gson = new GsonBuilder()
|
Gson gson = new GsonBuilder()
|
||||||
.registerTypeAdapter(Part.class, new TypeAdapter<Part>() {
|
.registerTypeAdapter(Part.class, new TypeAdapter<Part>() {
|
||||||
@Override public void write(JsonWriter out, Part user) throws IOException {
|
@Override public void write(JsonWriter out, Part part) throws IOException {
|
||||||
out.value("registeredAdapter");
|
out.value("registeredAdapter");
|
||||||
}
|
}
|
||||||
@Override public Part read(JsonReader in) throws IOException {
|
@Override public Part read(JsonReader in) throws IOException {
|
||||||
@ -56,6 +56,14 @@ public final class JsonAdapterAnnotationOnFieldsTest extends TestCase {
|
|||||||
assertEquals("registeredAdapterValue", gadget.part.name);
|
assertEquals("registeredAdapterValue", gadget.part.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testFieldAnnotationSupersedesClassAnnotation() {
|
||||||
|
Gson gson = new Gson();
|
||||||
|
String json = gson.toJson(new Computer2(new User("Inderjeet Singh")));
|
||||||
|
assertEquals("{\"user\":\"userJsonAdapter2\"}", json);
|
||||||
|
Computer2 target = gson.fromJson("{'user':'userJsonAdapter2Value'}", Computer2.class);
|
||||||
|
assertEquals("userJsonAdapter2Value", target.user.name);
|
||||||
|
}
|
||||||
|
|
||||||
private static final class Gadget {
|
private static final class Gadget {
|
||||||
@JsonAdapter(PartJsonAdapter.class)
|
@JsonAdapter(PartJsonAdapter.class)
|
||||||
final Part part;
|
final Part part;
|
||||||
@ -82,7 +90,6 @@ public final class JsonAdapterAnnotationOnFieldsTest extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final class Computer {
|
private static final class Computer {
|
||||||
@JsonAdapter(UserJsonAdapter.class)
|
|
||||||
final User user;
|
final User user;
|
||||||
Computer(User user) {
|
Computer(User user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
@ -119,4 +126,21 @@ public final class JsonAdapterAnnotationOnFieldsTest extends TestCase {
|
|||||||
return new User(firstName + " " + lastName);
|
return new User(firstName + " " + lastName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class Computer2 {
|
||||||
|
// overrides the JsonAdapter annotation of User with this
|
||||||
|
@JsonAdapter(UserJsonAdapter2.class)
|
||||||
|
final User user;
|
||||||
|
Computer2(User user) {
|
||||||
|
this.user = user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static final class UserJsonAdapter2 extends TypeAdapter<User> {
|
||||||
|
@Override public void write(JsonWriter out, User user) throws IOException {
|
||||||
|
out.value("userJsonAdapter2");
|
||||||
|
}
|
||||||
|
@Override public User read(JsonReader in) throws IOException {
|
||||||
|
return new User(in.nextString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user