Android新浪微博开发(3)JSon解析

  我在今天之前,可以说是没有接触过JSon的解析,今天就边学边总结,同时针对新浪微博返回的JSon进行解析,帮助自己巩固吧。我学习JSon解析是参考这个网址上的内容:http://lib.open-open.com/view/open1326376799874.html。一些JSon解析的基础知识和代码,大家可以看这篇文章。这边文章里面说,android2.3提供的JSon解析类,我使用的是android2.2,依然是提供JSon解析类的。

  现在开始针对新浪微博返回的数据来进行JSon解析,现在有这里有一个我发表一个微博成功之后返回的JSon数据。

{
    "created_at": "Wed Oct 10 14:20:07 +0800 2012",
    "id": 3499586935431840,
    "mid": "3499586935431840",
    "idstr": "3499586935431840",
    "text": "专注测试2天多",
    "source": "<a href=\"http://open.t.sina.com.cn\" rel=\"nofollow\">未通过审核应用</a>",
    "favorited": false,
    "truncated": false,
    "in_reply_to_status_id": "",
    "in_reply_to_user_id": "",
    "in_reply_to_screen_name": "",
    "geo": null,
    "user": {
        "id": 2494519890,
        "idstr": "2494519890",
        "screen_name": "各种路各种盲",
        "name": "各种路各种盲",
        "province": "34",
        "city": "16",
        "location": "安徽 亳州",
        "description": "",
        "url": "",
        "profile_image_url": "http://tp3.sinaimg.cn/2494519890/50/5614603461/1",
        "profile_url": "u/2494519890",
        "domain": "",
        "weihao": "",
        "gender": "m",
        "followers_count": 1,
        "friends_count": 0,
        "statuses_count": 9,
        "favourites_count": 0,
        "created_at": "Wed Oct 26 11:01:04 +0800 2011",
        "following": false,
        "allow_all_act_msg": false,
        "geo_enabled": true,
        "verified": false,
        "verified_type": -1,
        "allow_all_comment": true,
        "avatar_large": "http://tp3.sinaimg.cn/2494519890/180/5614603461/1",
        "verified_reason": "",
        "follow_me": false,
        "online_status": 0,
        "bi_followers_count": 0,
        "lang": "zh-cn"
    },
    "reposts_count": 0,
    "comments_count": 0,
    "attitudes_count": 0,
    "mlevel": 0,
    "visible": {
        "type": 0,
        "list_id": 0
    }
}

  先来一个迭代解析整个JSon数据的样例,参数json是上面新浪微博返回的JSon数据。

 1 try
 2 {
 3     JSONObject jsonObject = new JSONObject(json);
 4     for (Iterator<?> iterator = jsonObject.keys(); iterator.hasNext();)
 5     {
 6         String key = (String) iterator.next();
 7         Object value = jsonObject.opt(key);
 8         if (value instanceof JSONObject)
 9         {
10             JSONObject new_value = (JSONObject) value;
11             for (Iterator<?> iterator2 =  new_value.keys(); iterator2.hasNext();)
12             {
13                 String key2 = (String) iterator2.next();
14                 Object value2 = new_value.opt(key2);
15                 System.out.println(key2 + "=" + value2);
16             }
17         }
18         else
19         {
20             System.out.println(key + "=" + jsonObject.opt(key));
21         }
22 
23     }
24 }
25 catch (JSONException e)
26 {
27     e.printStackTrace();
28 }

  因为iterator是与原来的JSon数据中元素的顺序是不同的,所以看到的输出也是不同的。

  新浪微博返回的JSon数据不可能说每一个元素对我们都是有用的,我们可以只是对某几个元素感兴趣,所以我们可以把我们感兴趣的那些元素提取出来。

  

 1 try
 2 {
 3     JSONObject jsonObject = new JSONObject(json);
 4     /* 从JSon中从指定的元素中获取整型 */
 5     String textString = jsonObject.getString("text");
 6     String usernameString = jsonObject.getJSONObject("user").getString("name");
 7     String timeString = jsonObject.getString("created_at");
 8 
 9     /* 从JSon中从指定的元素中获取整型 */
10     int reposts_count = jsonObject.getInt("reposts_count");
11     int comments_count = jsonObject.optInt("comments_count");
12 
13     /* 从JSon中从指定的元素中获取boolean类型 */
14     boolean favorited = jsonObject.getBoolean("favorited");
15 
16     /* 通过字符匹配构造适合中国人的时间字符串 */
17     SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US);
18     Date date = sdf.parse(timeString);
19     sdf.applyPattern("yyyy年MM月dd日hh时mm分ss秒");
20     timeString = sdf.format(date);
21 
22     StringBuffer sb = new StringBuffer();
23     sb.append(usernameString).append("在").append(timeString).append("发布了一条微博,内容是:").append(textString)
24             .append("。目前转发数为").append(reposts_count).append(",评论数为").append(comments_count);
25 
26     if (favorited)
27     {
28         sb.append("。已经收藏。");
29     }
30     else
31     {
32         sb.append("。尚未收藏。");
33     }
34 
35     Log.i("", sb.toString());
36 }
37 catch (Exception e)
38 {
39     e.printStackTrace();
40 }

  获取指定的元素的方法有两个,一个是get方法,一个是opt方法。二者的区别是:

  • get可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException
  • opt也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值

   个人认为,使用opt方法会好一点,因为不会因为取值问题产生转化之类的异常。

 

  有时,新浪微博也会返回给我们一些JSon数组,例如我搜索关键词"阿信",新浪微博会返回给我下面的JSon数据。

 1 [
 2     {
 3         "screen_name": "阿信",
 4         "followers_count": 11091994,
 5         "uid": 1265020392
 6     },
 7     {
 8         "screen_name": "阿信星闻",
 9         "followers_count": 22427,
10         "uid": 1822541757
11     },
12     {
13         "screen_name": "阿信ken",
14         "followers_count": 10799,
15         "uid": 1870714545
16     },
17     {
18         "screen_name": "阿信歌友会",
19         "followers_count": 10493,
20         "uid": 1809449650
21     },
22     {
23         "screen_name": "阿信形象设计",
24         "followers_count": 10038,
25         "uid": 2122509095
26     },
27     {
28         "screen_name": "阿訫",
29         "followers_count": 515,
30         "uid": 1747978781
31     },
32     {
33         "screen_name": "阿信语录",
34         "followers_count": 4123,
35         "uid": 2091945521
36     },
37     {
38         "screen_name": "阿信-xiaoxiao",
39         "followers_count": 3761,
40         "uid": 2049489032
41     },
42     {
43         "screen_name": "阿信家的洗衣机",
44         "followers_count": 3526,
45         "uid": 1816621915
46     },
47     {
48         "screen_name": "阿信家的小胖话筒",
49         "followers_count": 2774,
50         "uid": 2728456684
51     }
52 ]

  解析代码:

 1 try
 2 {
 3     JSONArray jsonArray = new JSONArray(json);
 4     StringBuffer sb = new StringBuffer();
 5     for (int i = 0; i < jsonArray.length(); i++)
 6     {
 7         JSONObject jsonObject = jsonArray.getJSONObject(i);
 8         {
 9             String screen_name = jsonObject.optString("screen_name");
10             long followers_count = jsonObject.optLong("followers_count");
11             String uid = jsonObject.optString("uid");
12             sb.append("用户名:").append(screen_name).append("\n粉丝数:").append(followers_count).append("\nuid:")
13                     .append(uid).append("\n");
14             if (i != jsonArray.length() - 1)
15             {
16                 sb.append("--------------------------传说中的分隔线----------------------------\n");
17             }
18         }
19     }
20 
21     Log.i("", sb.toString());
22 }
23 catch (Exception e)
24 {
25     e.printStackTrace();
26 }

  另外,还有一些JSon中带有JSon类型的元素,即某一个元素的类型是一个JSon数据或者是一个JSon数据。这种情况只要获取到这个元素,继续进行JSon数据的解析就能继续解析了。

  至此,关于JSon的解析已经把经常使用到的方法都讲到了,关于JSon数据的构造由于在新浪微博中客户端并没有用到,所以就不在讲了。

  经过这3篇文章,我们就已经完全能够进行与新浪微博之间的交互,各个有权限的接口都可以使用,我们自己也能够实现自己的新浪微博客户端了。

你可能感兴趣的:(android)