You'll need to register a type adapter for Dog. Here's a full example that'll work with Gson 2.1:
public static void main(String[] args) {
TypeAdapter<Dog> dogTypeAdapter = new DogTypeAdapter().nullSafe();
Gson gson = new GsonBuilder()
.registerTypeAdapter(Dog.class, dogTypeAdapter)
.create();
Type listOfDogsType = new TypeToken<List<Dog>>() {}.getType();
List<Dog> dogs = Arrays.<Dog>asList(
new DefaultDog("Butters", "Irish Terrier"),
new DefaultDog("McFly", "Airedale Terrier"));
System.out.println(gson.toJson(dogs, listOfDogsType));
String json = "["
+ "{\"name\":\"Butters\",\"breed\":\"Irish Terrier\"},"
+ "{\"name\":\"McFly\",\"breed\":\"Airedale Terrier\"}"
+ "]";
System.out.println(gson.fromJson(json, listOfDogsType));
}
interface Dog {
String getName();
String getBreed();
}
static class DefaultDog implements Dog {
private final String name;
private final String breed;
DefaultDog(String name, String breed) {
this.breed = breed;
}
public String getName() {
return name;
}
public String getBreed() {
return breed;
}
@Override public String toString() {
return name + " (" + breed + ")";
}
}
private static class DogTypeAdapter extends TypeAdapter<Dog> {
@Override public void write(JsonWriter out, Dog dog) throws IOException {
out.beginObject();
out.value(dog.getName());
out.value(dog.getBreed());
out.endObject();
}
@Override public Dog read(JsonReader in) throws IOException {
String name = null;
String breed = null;
in.beginObject();
while (in.hasNext()) {
String key = in.nextName();
if (key.equals("name")) {
name = in.nextString();
} else if (key.equals("breed")) {
breed = in.nextString();
} else {
in.skipValue();
}
}
in.endObject();
return new DefaultDog(name, breed);
}
}