package com.yuyh.sprintnba.http.utils;
import android.text.TextUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.yuyh.library.utils.log.LogUtils;
import com.yuyh.sprintnba.http.bean.base.Base;
import com.yuyh.sprintnba.http.bean.match.LiveDetail;
import com.yuyh.sprintnba.http.bean.match.MatchStat;
import com.yuyh.sprintnba.http.bean.news.NewsDetail;
import com.yuyh.sprintnba.http.bean.news.NewsItem;
import com.yuyh.sprintnba.http.bean.player.Players;
import com.yuyh.sprintnba.http.bean.player.StatsRank;
import com.yuyh.sprintnba.http.bean.player.TeamsRank;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* @author yuyh.
* @date 16/6/4.
*/
public class JsonParser {
static Gson gson = new GsonBuilder().serializeNulls()
.registerTypeAdapter(MatchStat.MaxPlayers.MatchPlayerInfo.class, new MatchPlayerInfoDefaultAdapter())
.registerTypeHierarchyAdapter(List.class, new ListDefaultAdapter())
.create();
public static String parseBase(Base base, String jsonStr) {
JSONObject jsonObj = JSON.parseObject(jsonStr);
String data = "{}";
for (Map.Entry<String, Object> entry : jsonObj.entrySet()) {
if (entry.getKey().equals("code")) {
base.code = Integer.parseInt(entry.getValue().toString());
} else if (entry.getKey().equals("version")) {
base.version = entry.getValue().toString();
} else {
data = entry.getValue().toString();
}
}
return data;
}
public static <T> T parseWithGson(Class<T> classOfT, String jsonStr) {
return gson.fromJson(jsonStr, classOfT);
}
public static LiveDetail parseMatchLiveDetail(String jsonStr) {
LiveDetail detail = new LiveDetail();
detail.data = new LiveDetail.LiveDetailData();
String dataStr = JsonParser.parseBase(detail, jsonStr);
JSONObject data = JSON.parseObject(dataStr);
List<LiveDetail.LiveContent> list = new ArrayList<>();
for (Map.Entry<String, Object> item : data.entrySet()) {
if (item.getKey().equals("teamInfo")) {
String teamInfo = item.getValue().toString();
detail.data.teamInfo = new Gson().fromJson(teamInfo, LiveDetail.TeamInfo.class);
} else if (item.getKey().equals("detail")) {
JSONObject details = JSON.parseObject(item.getValue().toString());
if (details != null) {
for (Map.Entry<String, Object> entry : details.entrySet()) {
LiveDetail.LiveContent content;
String contentStr = entry.getValue().toString();
Gson gson = new Gson();
content = gson.fromJson(contentStr, LiveDetail.LiveContent.class);
content.id = entry.getKey();
list.add(content);
}
}
}
}
// 由于fastjson获取出来的entrySet是乱序的 所以这边重新排序
Collections.sort(list, new Comparator<LiveDetail.LiveContent>() {
@Override
public int compare(LiveDetail.LiveContent lhs, LiveDetail.LiveContent rhs) {
return rhs.id.compareTo(lhs.id);
}
});
detail.data.detail = list;
return detail;
}
public static NewsItem parseNewsItem(String jsonStr) {
NewsItem newsItem = new NewsItem();
JSONObject data = JSON.parseObject(JsonParser.parseBase(newsItem, jsonStr)); // articleIds= NullPoint
List<NewsItem.NewsItemBean> list = new ArrayList<NewsItem.NewsItemBean>();
//Set<String> keySet = data.keySet();
for (Map.Entry<String, Object> item : data.entrySet()) {
Gson gson = new Gson();
NewsItem.NewsItemBean bean = gson.fromJson(item.getValue().toString(), NewsItem.NewsItemBean.class);
bean.index = item.getKey();
list.add(bean);
}
// 由于fastjson获取出来的entrySet是乱序的 所以这边重新排序
Collections.sort(list, new Comparator<NewsItem.NewsItemBean>() {
@Override
public int compare(NewsItem.NewsItemBean lhs, NewsItem.NewsItemBean rhs) {
return rhs.index.compareTo(lhs.index);
}
});
newsItem.data = list;
return newsItem;
}
public static NewsDetail parseNewsDetail(String jsonStr) {
NewsDetail detail = new NewsDetail();
String dataStr = JsonParser.parseBase(detail, jsonStr);
JSONObject data = JSON.parseObject(dataStr);
if (data != null) {
for (Map.Entry<String, Object> entry : data.entrySet()) {
if (entry.getKey().equals("title")) {
detail.title = entry.getValue().toString();
} else if (entry.getKey().equals("abstract")) {
detail.abstractX = entry.getValue().toString();
} else if (entry.getKey().equals("content")) {
String contentStr = entry.getValue().toString();
try {
List<Map<String, String>> list = new LinkedList<>();
JSONArray jsonArray = new JSONArray(contentStr);
for (int i = 0; i < jsonArray.length(); i++) {
org.json.JSONObject item = jsonArray.getJSONObject(i); // 得到每个对象
Map<String, String> map = new HashMap<>();
if (item.get("type").equals("text")) {
map.put("text", item.get("info").toString());
} else if (item.get("type").equals("img")) {
String imgStr = item.get("img").toString();
JSONObject imgObj = JSON.parseObject(imgStr);
for (Map.Entry<String, Object> imgItem : imgObj.entrySet()) {
if (imgItem.getKey().toString().startsWith("imgurl") && !TextUtils.isEmpty(imgItem.getValue().toString())) {
JSONObject imgUrlObj = JSON.parseObject(imgItem.getValue().toString());
String url = imgUrlObj.getString("imgurl");
map.put("img", url);
break;
}
}
}
list.add(map);
}
detail.content = list;
} catch (Exception e) {
e.printStackTrace();
}
} else if (entry.getKey().equals("url")) {
detail.url = entry.getValue().toString();
} else if (entry.getKey().equals("imgurl")) {
detail.imgurl = entry.getValue().toString();
} else if (entry.getKey().equals("imgurl1")) {
detail.imgurl1 = entry.getValue().toString();
} else if (entry.getKey().equals("imgurl2")) {
detail.imgurl2 = entry.getValue().toString();
} else if (entry.getKey().equals("pub_time")) {
detail.time = entry.getValue().toString();
} else if (entry.getKey().equals("atype")) {
detail.atype = entry.getValue().toString();
} else if (entry.getKey().equals("commentId")) {
detail.commentId = entry.getValue().toString();
} else {
detail.newsAppId = entry.getValue().toString();
}
}
}
return detail;
}
public static StatsRank parseStatsRank(String jsonStr) {
StatsRank rank = new StatsRank();
String dataStr = JsonParser.parseBase(rank, jsonStr);
JSONObject data = JSON.parseObject(dataStr);
for (Map.Entry<String, Object> entry : data.entrySet()) {
rank.statType = entry.getKey();
String rankStr = entry.getValue().toString();
Gson gson = new Gson();
rank.rankList = gson.fromJson(rankStr, new TypeToken<List<StatsRank.RankItem>>() {
}.getType());
}
return rank;
}
public static TeamsRank parseTeamsRank(String jsonStr) {
TeamsRank rank = new TeamsRank();
String dataStr = JsonParser.parseBase(rank, jsonStr);
rank.east = new ArrayList<>();
rank.west = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(dataStr);
for (int i = 0; i < jsonArray.length(); i++) {
org.json.JSONObject item = jsonArray.getJSONObject(i); // 得到每个对象
String title = item.getString("title");
JSONArray teamsArray = item.optJSONArray("rows");
for (int j = 0; j < teamsArray.length(); j++) {
JSONArray teamsInfo = teamsArray.getJSONArray(j);
Gson gson = new Gson();
TeamsRank.TeamBean bean = gson.fromJson(teamsInfo.getString(0), TeamsRank.TeamBean.class);
bean.win = teamsInfo.optInt(1);
bean.lose = teamsInfo.optInt(2);
bean.rate = teamsInfo.optString(3);
bean.difference = teamsInfo.optString(4);
if (title.equals("东部联盟")) {
rank.east.add(bean);
} else {
rank.west.add(bean);
}
}
}
return rank;
} catch (Exception e) {
LogUtils.e(e.toString());
}
return null;
}
public static Players parsePlayersList(String jsonStr) {
Players players = new Players();
String dataStr = JsonParser.parseBase(players, jsonStr);
players.data = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(dataStr);
for (int i = 0; i < jsonArray.length(); i++) {
String itemStr = jsonArray.getString(i);
Players.Player player = new Players.Player();
Gson gson = new Gson();
player = gson.fromJson(itemStr, Players.Player.class);
players.data.add(player);
}
} catch (JSONException e) {
e.printStackTrace();
}
return players;
}
}