我正在使用Retrofit库进行REST调用。 进入的JSON看起来像这样。
{
"created_at": "2013-07-16T22:52:36Z",
}
如何告诉Retrofit或Gson将其转换为长?
答案 0 :(得分:24)
您可以通过在改装实例上使用自己的Gson对象设置自定义GsonConverter来轻松完成此操作。在您的POJO中,您可以Date created_at;
而不是长号或字符串。从日期对象中,您可以使用created_at.getTime()
在必要时获取长时间。
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssz")
.create();
RestAdapter.Builder builder = new RestAdapter.Builder();
// Use a custom GSON converter
builder.setConverter(new GsonConverter(gson));
..... create retrofit service.
您还可以通过在改装使用的gson实例上注册自定义JsonDeserializer
来支持多种日期字符串格式
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DateTypeDeserializer());
public class DateTypeDeserializer implements JsonDeserializer<Date> {
private static final String[] DATE_FORMATS = new String[]{
"yyyy-MM-dd'T'HH:mm:ssZ",
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd",
"EEE MMM dd HH:mm:ss z yyyy",
"HH:mm:ss",
"MM/dd/yyyy HH:mm:ss aaa",
"yyyy-MM-dd'T'HH:mm:ss.SSSSSS",
"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS",
"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'",
"MMM d',' yyyy H:mm:ss a"
};
@Override
public Date deserialize(JsonElement jsonElement, Type typeOF, JsonDeserializationContext context) throws JsonParseException {
for (String format : DATE_FORMATS) {
try {
return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString());
} catch (ParseException e) {
}
}
throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
+ "\". Supported formats: \n" + Arrays.toString(DATE_FORMATS));
}
}
答案 1 :(得分:2)
阅读完文档后,我尝试了这个。它有效,但我不知道它是否会对其他类型产生任何影响。
我需要在我的POJO中有一个很长的时间,因为我在保存到db时不想转换。
我使用了自定义反序列化器
JsonDeserializer<Long> deserializer = new JsonDeserializer<Long>() {
@Override
public Long deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
try{
if(json==null){
return new Long(0);
}
else{
String dateString = json.getAsString();
long dateLong = DateFormatUtil.getLongServerTime(dateString);
return new Long(dateLong);
}
}
catch(ParseException e){
return new Long(0);
}
}
};
并使用它
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.setDateFormat(patternFromServer)
.registerTypeAdapter(Long.class, deserializer)
.create();
答案 2 :(得分:2)
您可以简单地使用此setDateFormat()
方法来执行此操作
public class RestClient
{
private static final String BASE_URL = "your base url";
private ApiService apiService;
public RestClient()
{
Gson gson = new GsonBuilder()
.setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
.create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.FULL)
.setEndpoint(BASE_URL)
.setConverter(new GsonConverter(gson))
.build();
apiService = restAdapter.create(ApiService.class);
}
public ApiService getApiService()
{
return apiService;
}
}
答案 3 :(得分:1)
下面的代码经过测试,经过大量努力后终于开始工作了。 在创建改造对象之前创建Gson对象
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateDeserializer())
.registerTypeAdapter(Date.class, new DateSerializer())
.create();
现在创建改造实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("URL")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
创建这两个类来序列化和反序列化日期格式
static class DateDeserializer implements JsonDeserializer<Date> {
private final String TAG = DateDeserializer.class.getSimpleName();
@Override
public Date deserialize(JsonElement element, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
String date = element.getAsString();
SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
Date returnDate = null;
try {
returnDate = formatter.parse(date);
} catch (ParseException e) {
Log.e(TAG, "Date parser exception:", e);
returnDate = null;
}
return returnDate;
}
}
static class DateSerializer implements JsonSerializer<Date> {
private final String TAG = DateSerializer.class.getSimpleName();
@Override
public JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) {
SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
formatter.setTimeZone(TimeZone.getDefault());
String dateFormatAsString = formatter.format(date);
return new JsonPrimitive(dateFormatAsString);
}
}
答案 4 :(得分:0)
您可以在GsonBuilder.setDateFormat()
中设置解析模式,并在POJO中设置Date对象,然后只需调用Date.getMillis()
答案 5 :(得分:0)
您应该在Gson
实例中使用类型适配器
new GsonBuilder()
.registerTypeAdapter(Date.class, [date deserializer class here])
.create
但我可以建议您不要使用SimpleDateFormatter,而是在this class和this one中查看来自FasterXML / jackson-databind实现的ISO8601日期处理实现。这在很大程度上取决于你是否要分析很多日期。
另请注意,我们遇到了在Android应用程序中使用SimpleDateFormatter的问题(我们使用Java和Android库的组合),其中在Java和Android中进行解析之间存在不同的结果。使用上述实现有助于解决此问题。
这是Java implementation,这是Android implementation,而不是Java实现中Z
和X
的定义以及X
中缺少的{{1}}实现Android