Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [
- {
- "__typename": "Car",
- "id": "123",
- "name": "Toyota Prius",
- "numDoors": 4
- },
- {
- "__typename": "Boat",
- "id": "4567",
- "name": "U.S.S. Constitution",
- "propulsion": "SAIL"
- }
- ]
- public abstract class Vehicle {
- public final String id;
- public final String name;
- }
- public class Car extends Vehicle {
- public final Integer numDoors;
- }
- public class Boat extends Vehicle {
- public final String propulsion;
- }
- public class SemiParsedKindOfVehicle {
- public final String id;
- public final String name;
- public final Integer numDoors;
- public final String propulsion;
- public final String __typename;
- }
- import com.squareup.moshi.FromJson;
- import com.squareup.moshi.JsonAdapter;
- import com.squareup.moshi.Moshi;
- import com.squareup.moshi.ToJson;
- import com.squareup.moshi.Types;
- import org.junit.Assert;
- import org.junit.Test;
- import java.io.IOException;
- import java.lang.reflect.Type;
- import java.util.List;
- import java.util.Map;
- import static org.junit.Assert.assertEquals;
- public class Foo {
- static abstract class Vehicle {
- public String id;
- public String name;
- }
- static class Car extends Vehicle {
- public Integer numDoors;
- }
- static class Boat extends Vehicle {
- public String propulsion;
- }
- static class VehicleAdapter {
- @FromJson
- Vehicle fromJson(Map<String, Object> raw) {
- String typename=raw.get("__typename").toString();
- Vehicle result;
- if (typename.equals("Car")) {
- Car car=new Car();
- car.numDoors=((Double)raw.get("numDoors")).intValue();
- result=car;
- }
- else if (typename.equals("Boat")) {
- Boat boat=new Boat();
- boat.propulsion=raw.get("propulsion").toString();
- result=boat;
- }
- else {
- throw new IllegalStateException("Could not identify __typename: "+typename);
- }
- result.id=raw.get("id").toString();
- result.name=raw.get("name").toString();
- return(result);
- }
- @ToJson
- String toJson(Vehicle vehicle) {
- throw new UnsupportedOperationException("Um, why is this required?");
- }
- }
- static final String JSON="[n"+
- " {n"+
- " "__typename": "Car",n"+
- " "id": "123",n"+
- " "name": "Toyota Prius",n"+
- " "numDoors": 4n"+
- " },n"+
- " {n"+
- " "__typename": "Boat",n"+
- " "id": "4567",n"+
- " "name": "U.S.S. Constitution",n"+
- " "propulsion": "SAIL"n"+
- " }n"+
- "]";
- @Test
- public void deserializeGeneric() throws IOException {
- Moshi moshi=new Moshi.Builder().add(new VehicleAdapter()).build();
- Type payloadType=Types.newParameterizedType(List.class, Vehicle.class);
- JsonAdapter<List<Vehicle>> jsonAdapter=moshi.adapter(payloadType);
- List<Vehicle> result=jsonAdapter.fromJson(JSON);
- assertEquals(2, result.size());
- assertEquals(Car.class, result.get(0).getClass());
- Car car=(Car)result.get(0);
- assertEquals("123", car.id);
- assertEquals("Toyota Prius", car.name);
- assertEquals((long)4, (long)car.numDoors);
- assertEquals(Boat.class, result.get(1).getClass());
- Boat boat=(Boat)result.get(1);
- assertEquals("4567", boat.id);
- assertEquals("U.S.S. Constitution", boat.name);
- assertEquals("SAIL", boat.propulsion);
- }
- }
- private val moshi = Moshi.Builder()
- .add(
- PolymorphicJsonAdapterFactory.of(Vehicle::class.java, "__typename")
- .withSubtype(Car::class.java, "Car")
- .withSubtype(Boat::class.java, "Boat")
- )
- .build()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement