Support @SerializedName on annotations.
Fixes issue 347.
This commit is contained in:
parent
bb92447317
commit
214234e202
@ -25,6 +25,7 @@ import com.google.gson.JsonObject;
|
|||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import com.google.gson.JsonSyntaxException;
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.google.gson.TypeAdapter;
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
import com.google.gson.internal.LazilyParsedNumber;
|
import com.google.gson.internal.LazilyParsedNumber;
|
||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
import com.google.gson.stream.JsonReader;
|
import com.google.gson.stream.JsonReader;
|
||||||
@ -40,6 +41,7 @@ import java.util.BitSet;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
@ -644,21 +646,34 @@ public final class TypeAdapters {
|
|||||||
= newFactory(JsonElement.class, JSON_ELEMENT);
|
= newFactory(JsonElement.class, JSON_ELEMENT);
|
||||||
|
|
||||||
private static final class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T> {
|
private static final class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapter<T> {
|
||||||
private final Class<T> classOfT;
|
private final Map<String, T> nameToConstant = new HashMap<String, T>();
|
||||||
|
private final Map<T, String> constantToName = new HashMap<T, String>();
|
||||||
|
|
||||||
public EnumTypeAdapter(Class<T> classOfT) {
|
public EnumTypeAdapter(Class<T> classOfT) {
|
||||||
this.classOfT = classOfT;
|
try {
|
||||||
|
for (T constant : classOfT.getEnumConstants()) {
|
||||||
|
String name = constant.name();
|
||||||
|
SerializedName annotation = classOfT.getField(name).getAnnotation(SerializedName.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
name = annotation.value();
|
||||||
|
}
|
||||||
|
nameToConstant.put(name, constant);
|
||||||
|
constantToName.put(constant, name);
|
||||||
|
}
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public T read(JsonReader in) throws IOException {
|
public T read(JsonReader in) throws IOException {
|
||||||
if (in.peek() == JsonToken.NULL) {
|
if (in.peek() == JsonToken.NULL) {
|
||||||
in.nextNull();
|
in.nextNull();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return Enum.valueOf(classOfT, in.nextString());
|
return nameToConstant.get(in.nextString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(JsonWriter out, T value) throws IOException {
|
public void write(JsonWriter out, T value) throws IOException {
|
||||||
out.value(value == null ? null : value.name());
|
out.value(value == null ? null : constantToName.get(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,16 +25,15 @@ import com.google.gson.JsonParseException;
|
|||||||
import com.google.gson.JsonPrimitive;
|
import com.google.gson.JsonPrimitive;
|
||||||
import com.google.gson.JsonSerializationContext;
|
import com.google.gson.JsonSerializationContext;
|
||||||
import com.google.gson.JsonSerializer;
|
import com.google.gson.JsonSerializer;
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
import com.google.gson.common.MoreAsserts;
|
import com.google.gson.common.MoreAsserts;
|
||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functional tests for Java 5.0 enums.
|
* Functional tests for Java 5.0 enums.
|
||||||
@ -144,6 +143,11 @@ public class EnumTest extends TestCase {
|
|||||||
MoreAsserts.assertContains(actualJsonList, Roshambo.PAPER);
|
MoreAsserts.assertContains(actualJsonList, Roshambo.PAPER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testEnumCaseMapping() {
|
||||||
|
assertEquals(Gender.MALE, gson.fromJson("\"boy\"", Gender.class));
|
||||||
|
assertEquals("\"boy\"", gson.toJson(Gender.MALE, Gender.class));
|
||||||
|
}
|
||||||
|
|
||||||
public enum Roshambo {
|
public enum Roshambo {
|
||||||
ROCK {
|
ROCK {
|
||||||
@Override Roshambo defeats() {
|
@Override Roshambo defeats() {
|
||||||
@ -175,4 +179,12 @@ public class EnumTest extends TestCase {
|
|||||||
return Roshambo.valueOf(json.getAsString().substring(3));
|
return Roshambo.valueOf(json.getAsString().substring(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum Gender {
|
||||||
|
@SerializedName("boy")
|
||||||
|
MALE,
|
||||||
|
|
||||||
|
@SerializedName("girl")
|
||||||
|
FEMALE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user