package net.dev123.mblog.sina; import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import net.dev123.commons.util.ParseUtil; import net.dev123.exception.ExceptionCode; import net.dev123.exception.LibException; import net.dev123.mblog.entity.Trend; import net.dev123.mblog.entity.Trends; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class SinaTrendsAdapter { public static Trend createTrend(String jsonString) throws LibException { try { JSONObject json = new JSONObject(jsonString); return createTrend(json); } catch (JSONException e) { throw new LibException(ExceptionCode.JSON_PARSE_ERROR, e); } } static Trend createTrend(JSONObject json) throws LibException { Trend trend = new Trend(); trend.setName(ParseUtil.getRawString("name", json)); trend.setUrl(ParseUtil.getRawString("url", json)); trend.setQuery(ParseUtil.getRawString("query", json)); return trend; } public static List<Trends> createTrends(String jsonString) throws LibException { try { List<Trends> trendsList = null; JSONObject json = new JSONObject(jsonString); Date asOf = parseTrendsDate(json.getString("as_of")); JSONObject trendsJson = json.getJSONObject("trends"); trendsList = new ArrayList<Trends>(trendsJson.length()); Iterator<?> ite = trendsJson.keys(); while (ite.hasNext()) { String key = (String) ite.next(); JSONArray jsonArray = trendsJson.getJSONArray(key); Trend[] trendArray = new Trend[jsonArray.length()]; for (int i = 0; i < jsonArray.length(); i++) { Trend trend = createTrend(jsonArray.getJSONObject(i)); trendArray[i] = trend; } Date trendAt = null; if (key.length() == 19) { // current trends trendAt = ParseUtil.getDate(key, "yyyy-MM-dd HH:mm:ss"); } else if (key.length() == 16) { // daily trends trendAt = ParseUtil.getDate(key, "yyyy-MM-dd HH:mm"); } else if (key.length() == 10) { // weekly trends trendAt = ParseUtil.getDate(key, "yyyy-MM-dd"); } Trends trends = new Trends(); trends.setAsOf(asOf); trends.setTrendAt(trendAt); trends.setTrends(trendArray); trendsList.add(trends); } Collections.sort(trendsList); return trendsList; } catch (JSONException e) { throw new LibException(ExceptionCode.JSON_PARSE_ERROR, e); } catch (ParseException e) { throw new LibException(ExceptionCode.DATE_PARSE_ERROR, e); } } private static Date parseTrendsDate(String asOfStr) throws ParseException { Date parsed; switch (asOfStr.length()) { case 10: parsed = new Date(Long.parseLong(asOfStr) * 1000); break; case 20: parsed = ParseUtil.getDate(asOfStr, "yyyy-mm-dd'T'HH:mm:ss'Z'"); break; default: parsed = ParseUtil.getDate(asOfStr, "EEE, d MMM yyyy HH:mm:ss z"); } return parsed; } public static List<Trend> createUserTrends(String jsonStr) throws LibException { try { JSONArray jsonArray = new JSONArray(jsonStr); int size = jsonArray.length(); List<Trend> trendList = new ArrayList<Trend>(); Trend trend = null; JSONObject trendObj = null; for(int i = 0; i < size; i++) { trend = new Trend(); trendObj = jsonArray.getJSONObject(i); trend.setId(ParseUtil.getRawString("trend_id", trendObj)); trend.setName(ParseUtil.getRawString("hotword", trendObj)); trend.setNum(ParseUtil.getLong("num", trendObj)); trendList.add(trend); } return trendList; } catch (JSONException e) { throw new LibException(ExceptionCode.JSON_PARSE_ERROR, e); } } }