【JAVA】ニコニコ動画のXMLをJSON化してみた
お久しぶりです、マキ猫です(*゚∀゚)
JAVAを勉強して初めて作ったWebサービスが「VOCALO-TREND.com」なのですが、当初考えてた以上に沢山の人に使って頂きありがとうございました♫ 「初音ミクみく」さんや「ニコラジ」さんにもサイトを紹介して頂いて作って良かったなぁって思ってます(*´ω`*)
かなり稚拙なプログラミングでJavaを使っておきながら、クライアントサイドなjavaScriptでゴリゴリ動かす仕様なので若干重めになっています^^;;
ならば直接サーバーサイドで書いてみたらと言うことで「niconico4J」という面白いJarを見つけてきたので、早速ニコニコ動画のXMLをJSON化するサンプルプログラムを書いてみました。
package niconico; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.DatatypeConverter; import net.arnx.jsonic.JSON; import analyzer.GetFlvXmlPather; import bean.TagBean; import bean.ThumbInfoBean; import connect.HttpConnector; public class XML_To_Json { public static void main(String[] args){ Map<String, Object> map1_1 = new HashMap<String, Object>(); map1_1.put("hashtag", "sm14917720"); map1_1.put("count_tw", "10"); map1_1.put("max_rt", "5"); map1_1.put("count_rt", "12"); map1_1.put("total_points", "117"); Map<String, Object> map1_2 = new HashMap<String, Object>(); map1_2.put("hashtag", "sm14285610"); map1_2.put("count_tw", "30"); map1_2.put("max_rt", "5"); map1_2.put("count_rt", "10"); map1_2.put("total_points", "315"); Map<String, Object> map1_3 = new HashMap<String, Object>(); map1_3.put("hashtag", "sm7"); map1_3.put("count_tw", "20"); map1_3.put("max_rt", "0"); map1_3.put("count_rt", "12"); map1_3.put("total_points", "212"); Map<String, Object> map1_4 = new HashMap<String, Object>(); map1_4.put("hashtag", "sm14917525"); map1_4.put("count_tw", "20"); map1_4.put("max_rt", "0"); map1_4.put("count_rt", "12"); map1_4.put("total_points", "212"); try { List<Map<String, Object>> list1 = new ArrayList<Map<String,Object>>(); list1.add(map1_1); list1.add(map1_2); list1.add(map1_3); list1.add(map1_4); //System.out.println(JSON.encode(list1, true)); //System.out.println("-----"); List<Map<String,Object>> list2 = new ArrayList<Map<String,Object>>(); for(int i = 0; i < list1.size() ; i++){ HttpConnector connector = new HttpConnector(); InputStream id = connector.getVideoInfo((String) list1.get(i).get("hashtag")); GetFlvXmlPather pather = new GetFlvXmlPather(); ThumbInfoBean thumbInfo = pather.getFlv(id); String status = thumbInfo.getResponseStatus(); if(status.equals("ok")){ SimpleDateFormat dateFormatter_nicodate = new SimpleDateFormat("yyyy年MM月dd日 kk時mm分 "); Calendar nicodate =DatatypeConverter.parseDateTime(thumbInfo.getFirstRetrive()); String date = dateFormatter_nicodate.format(nicodate.getTime()); String videoId = thumbInfo.getVideoId(); String title = thumbInfo.getTitle(); String watchUrl = thumbInfo.getWatchUrl(); String thumbnailUrl = thumbInfo.getThumbnailUrl(); String length = thumbInfo.getLength(); String viewCounter = DecimalFormat(thumbInfo.getViewCounter()); String commentNum = DecimalFormat(thumbInfo.getCommentNum()); String mylistCounter = DecimalFormat(thumbInfo.getMylistCounter()); String description = thumbInfo.getDescription(); String lastResBody = thumbInfo.getLastResBody(); Map<String, Object> nicoMap = new HashMap<String, Object>(); Map<String, Object> nicoStatus = new HashMap<String, Object>(); nicoMap.put("nicoStatus",nicoStatus); nicoMap.put("nicoTitle",title); nicoMap.put("nicoDate",date); nicoMap.put("nicoId",videoId); nicoMap.put("nicoUrl",watchUrl); nicoMap.put("nicoThumb",thumbnailUrl); nicoMap.put("nicoLength",length); nicoMap.put("nicoCountView",viewCounter); nicoMap.put("nicoCountComment",commentNum); nicoMap.put("nicoCountMylist",mylistCounter); nicoMap.put("nicoDescription",description); nicoMap.put("nicoLastResBody",lastResBody); ArrayList<TagBean> tagArray = thumbInfo.getTagArray(); ArrayList<String> tagList = new ArrayList<String>(); for(TagBean tag:tagArray){ if(tag.getDomain().equals("jp")){ tagList.add(tag.getTag()); } } nicoMap.put("tag", tagList); list2.add(nicoMap); }else{ Map<String, Object> nicoMap = new HashMap<String, Object>(); nicoMap.put("nicoId", list1.get(i).get("hashtag")); nicoMap.put("nicoStatus",status); list2.add(nicoMap); } } for (Map<String, Object> map1 : list1) { List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); for (Map<String, Object> map2 : list2) { if (map1.get("hashtag").equals(map2.get("nicoId"))) { data.add(map2); } } map1.put("nicoInfo", data); } System.out.println(JSON.encode(list1, true)); } catch (Exception e) { e.printStackTrace(); } } public static String DecimalFormat(Object object) { DecimalFormat df1 = new DecimalFormat("###,###,###"); return df1.format(object); } }
動画が削除されている場合、nicovideo_thumb_responseのStatus値が"fail"になるのですが、JSON化するときに動画情報と同じテーブルに組み込まれてしまっているので使い勝手は悪いかもしれないので改良の余地はあるかも。
テストでサーバーサイドとクライアントサイドで使用してみたんですけど、体感速度的にはあまり違いを感じなかったので現状そのままにしています。
(※DBの負荷がネックになってるのは置いといてw)
将来的にサイトデザインをリニューアルしたり、ブログパーツ化するときに全部まとめて取得できるのでその時にでも考えようと思います(´・ω・`)