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:
Inderjeet Singh 2014-03-09 08:21:06 +00:00
parent f88eee094c
commit 67af0dd8f8
2 changed files with 43 additions and 4 deletions

View File

@ -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 &#64JsonAdapter annotation, it * Since User class specified UserJsonAdapter.class in &#64JsonAdapter 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 {
* &#64JsonAdapter(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

View File

@ -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());
}
}
} }