之前发过一篇开发新浪微博的文章,对于大家比较感兴趣的内容之一便是如何解析新浪微博的JSON。
其实一开始的时候,也遇过一些挫折,比如直接用JsonArray和JsonObject去解析JSON内容的话,是解析不了的。
因为JSON的格式比较固定,像新浪微博返回的JSON内容则是多了一个中括号及statues标签,如下:
{ "statuses": [ { "created_at": "Tue May 31 17:46:55 +0800 2011", "id": 11488058246, "text": "求关注。", "source": "<a href="http://weibo.com" rel="nofollow">新浪微博</a>", "favorited": false, "truncated": false, "in_reply_to_status_id": "", "in_reply_to_user_id": "", "in_reply_to_screen_name": "", "geo": null, "mid": "5612814510546515491", "reposts_count": 8, "comments_count": 9, "annotations": [], "user": { "id": 1404376560, "screen_name": "zaku", "name": "zaku", "province": "11", "city": "5", "location": "北京 朝阳区", "description": "人生五十年,乃如梦如幻;有生斯有死,壮士复何憾。", "url": "http://blog.sina.com.cn/zaku", "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1", "domain": "zaku", "gender": "m", "followers_count": 1204, "friends_count": 447, "statuses_count": 2908, "favourites_count": 0, "created_at": "Fri Aug 28 00:00:00 +0800 2009", "following": false, "allow_all_act_msg": false, "remark": "", "geo_enabled": true, "verified": false, "allow_all_comment": true, "avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1", "verified_reason": "", "follow_me": false, "online_status": 0, "bi_followers_count": 215 } }, ... ], "previous_cursor": 0, // 暂未支持 "next_cursor": 11488013766, // 暂未支持 "total_number": 81655 }我的目标就是先去掉以上红色字体的内容,这个比较容易实现。
//将获取到的json内容变成可以正常解析的文本 public static String parseJsonText(String jtext){ char leftSymbol='['; char rightSymbol=']'; String result=""; for(int i=0;i<jtext.length();i++){ if(leftSymbol==jtext.charAt(i)){ result=jtext.substring(i,jtext.length()); break; } } for(int i=result.length();i>0;i--){ if(rightSymbol==result.charAt(i-1)){ result=result.substring(0, i); break; } } return result; }处理完就可以直接用JsonArray和JsonObject来解析相关的内容了。
第二步就是实现一个List<HashMap<String,String>>,用于填充ListView。
下面的方法返回一个List<HashMap<String,String>>,并在其中解析JSON内容。
private List<HashMap<String, String>> listview(String rlt) { String result = ParseJson.parseJsonText(rlt); try { JSONArray jsonArrays = new JSONArray(result); for (int i = 0; i < jsonArrays.length(); i++) { JSONObject jsonObject = jsonArrays.getJSONObject(i); HashMap<String, String> map = new HashMap<String, String>(); // 获得微博的ID String ID = jsonObject.getString("id"); contentId.add(ID); // 获得微博内容 String text = jsonObject.getString("text"); // 获得微博来源 String source = jsonObject.getString("source"); // 获得微博的发表时间 String created_at = jsonObject.getString("created_at"); // 生成user的可用JSON对象 JSONObject userJson = jsonObject.getJSONObject("user"); // 获得发表微博的用户名 String username = userJson.getString("name"); map.put("text", text); map.put("name", username); map.put("source", "来自" + "【" + source + "】"); map.put("created_at", ParseJson.getFormatTime(created_at)); if (jsonObject.has("retweeted_status")) { JSONObject retweetedJson = jsonObject .getJSONObject("retweeted_status"); // 获得转发微博的内容 String retweetedText = retweetedJson.getString("text"); map.put("retweetedText", retweetedText); JSONObject retWeetedUserNameJson = retweetedJson .getJSONObject("user"); // 获得转发微博内容的用户名 String retweetedContent = retWeetedUserNameJson .getString("name"); map.put("retweetedContent", retweetedContent + ":" + retweetedText); } listArrays.add(map); } } catch (JSONException e) { // TODO Auto-generated catch block System.out.println(e.getMessage()); } return listArrays; }