java - not - gson nested objects
¿Cómo escribo un deserializador JSON personalizado para Gson? (2)
Tomaría un enfoque ligeramente diferente de la siguiente manera, a fin de minimizar el análisis "manual" en mi código, ya que innecesariamente, de otro modo, de alguna manera se derrota el propósito de por qué usaría una API como Gson en primer lugar.
// output:
// [User: id=1, name=Jonas, updateDate=2011-03-24 03:35:00.226]
// [User: id=5, name=Test, updateDate=2011-05-07 08:31:38.024]
// using java.sql.Timestamp
public class Foo
{
static String jsonInput =
"[" +
"{/"id/":1,/"name/":/"Jonas/",/"update_date/":/"1300962900226/"}," +
"{/"id/":5,/"name/":/"Test/",/"update_date/":/"1304782298024/"}" +
"]";
public static void main(String[] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(Timestamp.class, new TimestampDeserializer());
Gson gson = gsonBuilder.create();
User[] users = gson.fromJson(jsonInput, User[].class);
for (User user : users)
{
System.out.println(user);
}
}
}
class User
{
int id;
String name;
Timestamp updateDate;
@Override
public String toString()
{
return String.format(
"[User: id=%1$d, name=%2$s, updateDate=%3$s]",
id, name, updateDate);
}
}
class TimestampDeserializer implements JsonDeserializer<Timestamp>
{
@Override
public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
long time = Long.parseLong(json.getAsString());
return new Timestamp(time);
}
}
(Esto supone que "date_date" debe ser "update_date", en la pregunta original).
Tengo una clase Java, usuario:
public class User
{
int id;
String name;
Timestamp updateDate;
}
Y recibo una lista JSON que contiene objetos de usuario de un servicio web:
[{"id":1,"name":"Jonas","update_date":"1300962900226"},
{"id":5,"name":"Test","date_date":"1304782298024"}]
Intenté escribir un deserializador personalizado:
@Override
public User deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
return new User(
json.getAsJsonPrimitive().getAsInt(),
json.getAsString(),
json.getAsInt(),
(Timestamp)context.deserialize(json.getAsJsonPrimitive(),
Timestamp.class));
}
Pero mi deserializador no funciona. ¿Cómo puedo escribir un deserializador JSON personalizado para Gson?
@Override
public User deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
JsonObject jobject = json.getAsJsonObject();
return new User(
jobject.get("id").getAsInt(),
jobject.get("name").getAsString(),
new Timestamp(jobject.get("update_date").getAsLong()));
}
Supongo que la clase de usuario tiene el constructor apropiado.