YouTube Data API のJSON データの datetime 値を Gson で扱うには
YouTube Data API から取得した、データを Gson を使ってパースしようとしているのですが、対応するクラスについて、一つ疑問があります。リファレンスを拝見すると publishedAt
の型は、 datetime
となっていますが、次の例のように、 Gson では Date
型で当てはめてもいいのでしょうか、
コード:
public class Snippet {
public Date publishedAt;
public String title;
public String description;
public Thumbnails thumbnails;
}
これを実行したところ、独自に作成した CustomAdapter
で以下の NullPointerException
が出てしまいました。
エラー:
java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
CustomAdapter:
public class CustomAdapter extends ArrayAdapter<Items> {
private LayoutInflater layoutInflater;
private ImageLoader mImageLoader;
private RequestQueue mQueue;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
public CustomAdapter(Context context, int textViewResourceId, List<Items> objects, RequestQueue queue){
super(context, textViewResourceId, objects);
layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mImageLoader = new ImageLoader(queue, new LruCacheClass());
}
static class ViewHolder{
ImageView image;
TextView title;
TextView maker;
TextView numView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
Items item = getItem(position);
String url = item.snippet.thumbnails.high.url;
if(convertView==null){
convertView = layoutInflater.inflate(R.layout.list_search, parent, false);
holder = new ViewHolder();
holder.image = (ImageView)convertView.findViewById(R.id.iv_thumbnail);
holder.title = (TextView)convertView.findViewById(R.id.tv_movie_title);
holder.maker = (TextView)convertView.findViewById(R.id.tv_maker);
holder.numView = (TextView)convertView.findViewById(R.id.tv_day_num_view);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
ImageLoader.ImageListener listener = ImageLoader.getImageListener(holder.image,
android.R.drawable.spinner_background,
android.R.drawable.ic_dialog_alert);
mImageLoader.get(url, listener);
holder.title.setText(item.snippet.title);
holder.maker.setText(item.channelTitle);
//この行でNullPointerExceptionがでてしまう。
holder.numView.setText(sdf.format(item.snippet.publishedAt.getTime()));
return convertView;
}
}
また、 publishedAt
でタイムゾーンに依存させたいので、こちらのサイトを参考にして Gson を編集しています。
BuildGson:
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
/**
* Created by zousan on 2015/01/25.
*/
public class BuildGson {
public static Gson buildGsonForPublishedAt() {
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonElement dateElement, Type arg1, JsonDeserializationContext arg2)
throws JsonParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.s'Z'");
sdf.setTimeZone(TimeZone.getDefault());
String date = dateElement.getAsString();
try {
return sdf.parse(date);
} catch (ParseException e) {
//System.err(String.format("Gsonのパースに失敗しました: %s", date));
return null;
}
}
});
gb.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return gb.create();
}
}
改善点等ありましたら教えていただけると助かります。