Livro de receitas de desserialização do Gson
Neste livro de receitas, estamos explorando as várias maneiras deunmarshall JSON into Java objects, usando o popularGson library.
1. Desserializar JSON para objeto básico único
Vamos começar com algo simples - vamos paraunmarshall a simple json to a Java object – Foo:
public class Foo {
public int intValue;
public String stringValue;
// + standard equals and hashCode implementations
}
E a solução:
@Test
public void whenDeserializingToSimpleObject_thenCorrect() {
String json = "{"intValue":1,"stringValue":"one"}";
Foo targetObject = new Gson().fromJson(json, Foo.class);
assertEquals(targetObject.intValue, 1);
assertEquals(targetObject.stringValue, "one");
}
Leitura adicional:
Excluir campos da serialização no Gson
Explore as opções disponíveis para excluir campos da serialização no Gson.
Livro de receitas de serialização do Gson
Aprenda a serializar entidades usando a biblioteca Gson.
2. Desserializar JSON para objeto genérico
A seguir - vamos definir um objeto usando genéricos:
public class GenericFoo {
public T theValue;
}
E unmarshall algum json neste tipo de objeto:
@Test
public void whenDeserializingToGenericObject_thenCorrect() {
Type typeToken = new TypeToken>() { }.getType();
String json = "{"theValue":1}";
GenericFoo targetObject = new Gson().fromJson(json, typeToken);
assertEquals(targetObject.theValue, new Integer(1));
}
3. Desserializar JSON com campos extra desconhecidos para objeto
Em seguida - vamos desserializar algum json complexo que contémunknown fields adicional:
@Test
public void givenJsonHasExtraValues_whenDeserializing_thenCorrect() {
String json =
"{"intValue":1,"stringValue":"one","extraString":"two","extraFloat":2.2}";
Foo targetObject = new Gson().fromJson(json, Foo.class);
assertEquals(targetObject.intValue, 1);
assertEquals(targetObject.stringValue, "one");
}
Como você pode ver,Gson will ignore the unknown fieldse simplesmente combine os campos que é capaz.
4. Desserializar JSON com nomes de campo não correspondentes para objeto
Agora, vamos ver como Gson se sai com uma string json contendo campos que simplesmente não correspondem aos campos de nosso objetoFoo:
@Test
public void givenJsonHasNonMatchingFields_whenDeserializingWithCustomDeserializer_thenCorrect() {
String json = "{"valueInt":7,"valueString":"seven"}";
GsonBuilder gsonBldr = new GsonBuilder();
gsonBldr.registerTypeAdapter(Foo.class, new FooDeserializerFromJsonWithDifferentFields());
Foo targetObject = gsonBldr.create().fromJson(json, Foo.class);
assertEquals(targetObject.intValue, 7);
assertEquals(targetObject.stringValue, "seven");
}
Observe que registramosa custom deserializer - isso foi capaz de analisar corretamente os campos da string json e mapeá-los para nossoFoo:
public class FooDeserializerFromJsonWithDifferentFields implements JsonDeserializer {
@Override
public Foo deserialize
(JsonElement jElement, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jObject = jElement.getAsJsonObject();
int intValue = jObject.get("valueInt").getAsInt();
String stringValue = jObject.get("valueString").getAsString();
return new Foo(intValue, stringValue);
}
}
5. Desserializar array JSON para array de objetos Java
A seguir, vamos desserializara json array into a Java array de objetosFoo:
@Test
public void givenJsonArrayOfFoos_whenDeserializingToArray_thenCorrect() {
String json = "[{"intValue":1,"stringValue":"one"}," +
"{"intValue":2,"stringValue":"two"}]";
Foo[] targetArray = new GsonBuilder().create().fromJson(json, Foo[].class);
assertThat(Lists.newArrayList(targetArray), hasItem(new Foo(1, "one")));
assertThat(Lists.newArrayList(targetArray), hasItem(new Foo(2, "two")));
assertThat(Lists.newArrayList(targetArray), not(hasItem(new Foo(1, "two"))));
}
6. Desserializar array JSON para coleção Java
A seguir, um array jsondirectly into a Java Collection:
@Test
public void givenJsonArrayOfFoos_whenDeserializingCollection_thenCorrect() {
String json =
"[{"intValue":1,"stringValue":"one"},{"intValue":2,"stringValue":"two"}]";
Type targetClassType = new TypeToken>() { }.getType();
Collection targetCollection = new Gson().fromJson(json, targetClassType);
assertThat(targetCollection, instanceOf(ArrayList.class));
}
7. Desserializar JSON para objetos aninhados
A seguir, vamos definir nosso objeto aninhado -FooWithInner:
public class FooWithInner {
public int intValue;
public String stringValue;
public InnerFoo innerFoo;
public class InnerFoo {
public String name;
}
}
E aqui está como desserializar uma entrada contendo este objeto aninhado:
@Test
public void whenDeserializingToNestedObjects_thenCorrect() {
String json = "{\"intValue\":1,\"stringValue\":\"one\",\"innerFoo\":{\"name\":\"inner\"}}";
FooWithInner targetObject = new Gson().fromJson(json, FooWithInner.class);
assertEquals(targetObject.intValue, 1);
assertEquals(targetObject.stringValue, "one");
assertEquals(targetObject.innerFoo.name, "inner");
}
8. Desserializar JSON usando construtor personalizado
Finalmente, vamos ver como forçar o uso de um construtor específico durante as desserializações em vez do padrão - nenhum construtor de argumentos - usandoInstanceCreator:
public class FooInstanceCreator implements InstanceCreator {
@Override
public Foo createInstance(Type type) {
return new Foo("sample");
}
}
E aqui está como usar nossoFooInstanceCreator na desserialização:
@Test
public void whenDeserializingUsingInstanceCreator_thenCorrect() {
String json = "{\"intValue\":1}";
GsonBuilder gsonBldr = new GsonBuilder();
gsonBldr.registerTypeAdapter(Foo.class, new FooInstanceCreator());
Foo targetObject = gsonBldr.create().fromJson(json, Foo.class);
assertEquals(targetObject.intValue, 1);
assertEquals(targetObject.stringValue, "sample");
}
Observe que, em vez de nulo,Foo.stringValue é igual asample, pois usamos o seguinte construtor:
public Foo(String stringValue) {
this.stringValue = stringValue;
}
9. Conclusão
Este artigo mostra como alavancar a biblioteca Gson paraparse JSON input - examinando os casos de uso mais comuns para objetos únicos e múltiplos.
A implementação de todos esses exemplos e fragmentos de códigocan be found in my github project - este é um projeto baseado no Eclipse, portanto, deve ser fácil de importar e executar como está.