在json中改进Android Gson反序列化日期

时间:2016-08-21 11:04:45

标签: android json gson deserialization retrofit

我有以下问题: 我的API的答案总是像这样的“风格”:

{
  "type": "dbUserResponse",
  "user": {
    "apellido": "canadas",
    "email": "rj@canada.es",
    "nacimiento": "1995-01-01T00:00:00+01:00",
  }
}

即字段“dbXXXXResponse”和模型。即,字段“响应”和模型。在这种情况下用户。模型警报的另一个例子:

{
  "type": "dbAlertResponse",
  "alert": {
    "alertId": 0,
    "fecha": "2004-10-19T10:23:54+02:00",
  }
}
Oki ......我需要什么?创建一个类型适配器反序列化或更多? 一个通用,或者我必须为每个模型制作一个typedapter。 我做了以下事情:

    public class GenericDeserializer<T> implements JsonDeserializer<T>
    {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
        throws JsonParseException
{
    // Get the "content" element from the parsed JSON
    JsonElement content = je.getAsJsonObject().get("type");


    if(content.toString().equals("\"dbUserResponse\"")){
        content = je.getAsJsonObject().get("user");

        JsonObject jsonObject = content.getAsJsonObject();
        if(jsonObject.has("nacimiento")){
            String date = jsonObject.get("nacimiento").getAsString();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            Date date2 = null;
            try {
                date2 = sdf.parse(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date2);
            jsonObject.addProperty("nacimiento", newstring);
            content = jsonObject.getAsJsonObject();  
            }
        }

    }
    if(content.toString().equals("\"dbAlertResponse\"")){
    // other case..... etc...

    }

    else{
        //content = '{"error":"mierror"}';
    }


    // Deserialize it. You use a new instance of Gson to avoid infinite recursion
    // to this deserializer
    return new Gson().fromJson(content, type);

}
}

因此,我成功获得了子JSON“用户”并在Android中填充了我的用户模型。 但“nacimiento”(日期)字段未格式化: - (

我还创建了Singleton Retrofit,我不确定它是否正确:

public class SingletonRetrofit {

public static final String BASE_URL = "xxxxxxxxxxxxxxxxxxx";
private static Retrofit retrofit = null;

public static Retrofit getClient() {

    Gson gson = new GsonBuilder()
                    .registerTypeAdapter(User.class, new GenericDeserializer<User>())
                    .create();

    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
    return retrofit;
}
}

我的问题: 1º-当模特在像我这样的另一个Json Json里面时,如何正确格式化日期? 2º-我是否必须为每个型号创建一个typeadapter? :-S 谢谢

1 个答案:

答案 0 :(得分:0)

为什么不使用POJO? JSON中的日期是String,因此您必须将String转换为Date。