文档章节

新浪微博数据Json格式解析

y
 yunpiao
发布于 2014/12/09 20:23
字数 1754
阅读 34
收藏 0

Json格式解析

 

json结构的格式就是若干个 键/值(key, value) 对的集合,该集合可以理解为字典(Dictionary),每个 键/值 对可以理解成一个对象(Object)。 键/值 对中的 键(key) 一般是 一个string,值(value)可以是string、double、int等基本类型,也可以嵌套一个 键/值 对,也可以是一个数组,数组里面的数据的类型可以是基本类型,或者 键/值 对。可以看出 键/值 本来没什么,只是嵌套得多了就会觉得混乱,下面举个具体的例子来说明。注:该代码只是用来举例说明,并不能正确运行。

复制代码  

 1             var testJson = {                      
2                             "Name" :      "奥巴马" ,
3                             "ByName" :    ["小奥","小巴","小马"],
4                             "Education" : {
5                                            "GradeSchool" :  "华盛顿第一小学",
6                                            "MiddleSchool" : ["华盛顿第一初中" , "华盛顿第一高中"],
7                                            "University" :  {
8                                                               "Name" : "哈佛大学",
9                                                               "Specialty" : ["软件工程","会计"]
10                                                             }
11                                       }
12                         }

 

复制代码  

变量testJson就是一个json对象,testJson对象包括三个 键/值 对。

第一个 键/值 对: 键(key)是"Name“ ,其对应的值(value)是 "奥巴马" ,即 testJson["Name"]  == "奥巴马"

第二个 键/值 对: 键 是 "ByName" ,值是一个数组,是一个string集合。有必要的话,数组里面的元素也可以是 键/值 对。

第三个 键/值 对: 键 是 "Education",值是一个 Json对像,该json对象包括三个 键/值 对,这就是嵌套了。

总结:json对象就是若干个 键/值 对的集合,键是string,值可以是基本类型,或者嵌套一个Json对象,或者是一个数组(数组里的元素可以是基本类型,也可以是json对象,可以继续嵌套)。

获取名字:testJson["Name"]

获取第一个别名:testJson["ByName"][0] 。testJson的 键"ByName" 对应的值 是一个string数组 

获取小学名字: testJson["Education"]["GradeSchool"] , 获取大学主修专业:testJson["Education"]["University"]["Specialty"][0]

 

下面举个实例:

定义一个符合json格式要求的字符串:

string testJson = "{\"Name\" : \"奥巴马\",\"ByName\" : [\"小奥\",\"小巴\",\"小马\"],\"Education\":{\"GradeSchool\" : \"华盛顿第一小学\",\"MiddleSchool\" : [\"华盛顿第一初中\" , \"华盛顿第一高中\"], \"University\" :{ \"Name\" : \"哈佛大学\", \"Specialty\" : [\"软件工程\",\"会计\"]}}}";

 

然后需要用该字符串作为参数new 一个 JsonObject对象。微软自带的类库 System.Json ,然后添加命名空间 using System.Json;

主要代码就一句:JsonObject js = JsonObject.Parse(testJson); 用字符串testJson 作为参数new 一个 JsonObject 对象。通过监视我们可以看到js里面的内容和预料的一样,通过下面这幅图你应该可琢磨出很多东西来吧

 

在做这个之前我对JSON解析了解的不是很多,只能对一些简单的数据解析,对于稍微复杂一点的结构就一筹莫展了,在网上找了很多资料也没能解决

后来看了这个帖子,终于稍微摸到了一点门道:http://hi.baidu.com/iiloveloveyouyou/blog/item/cec41b1d5ccdf48087d6b68e.html/cmtid/465fd0f12cea96cc7931aa9a


首先先看一下新浪微博目前的JSON的结构

[html]    view plain       copy       print       ?  

  1. {  

  2.     "statuses": [  

  3.         {  //位置1  

  4.             "created_at": "Tue May 31 17:46:55 +0800 2011",  // 位置2  

  5.             "id": 11488058246,  

  6.             "text": "求关注。",  

  7.             "source": "<a href="http://weibo.com" rel="nofollow">新浪微博</a>",  

  8.             "favorited": false,  

  9.             "truncated": false,  

  10.             "in_reply_to_status_id": "",  

  11.             "in_reply_to_user_id": "",  

  12.             "in_reply_to_screen_name": "",  

  13.             "geo": null,  

  14.             "mid": "5612814510546515491",  

  15.             "reposts_count": 8,  

  16.             "comments_count": 9,  

  17.             "annotations": [],  

  18.             "user": {  //位置3  

  19.                 "id": 1404376560,  

  20.                 "screen_name": "zaku",  

  21.                 "name": "zaku",  

  22.                 "province": "11",  

  23.                 "city": "5",  

  24.                 "location": "北京 朝阳区",  

  25.                 "description": "人生五十年,乃如梦如幻;有生斯有死,壮士复何憾。",  

  26.                 "url": "http://blog.sina.com.cn/zaku",  

  27.                 "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1",  

  28.                 "domain": "zaku",  

  29.                 "gender": "m",  

  30.                 "followers_count": 1204,  

  31.                 "friends_count": 447,  

  32.                 "statuses_count": 2908,  

  33.                 "favourites_count": 0,  

  34.                 "created_at": "Fri Aug 28 00:00:00 +0800 2009",  

  35.                 "following": false,  

  36.                 "allow_all_act_msg": false,  

  37.                 "remark": "",  

  38.                 "geo_enabled": true,  

  39.                 "verified": false,  

  40.                 "allow_all_comment": true,  

  41.                 "avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1",  

  42.                 "verified_reason": "",  

  43.                 "follow_me": false,  

  44.                 "online_status": 0,  

  45.                 "bi_followers_count": 215  

  46.             }  

  47.         },  

  48.         ...  

  49.     ],  

  50.     "previous_cursor": 0,  // 位置4  

  51.     "next_cursor": 11488013766,  

  52.     "total_number": 81655  

  53. }  

{
    "statuses": [
        {  //位置1
            "created_at": "Tue May 31 17:46:55 +0800 2011",  // 位置2
            "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": {  //位置3
                "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,  // 位置4
    "next_cursor": 11488013766,
    "total_number": 81655
}

#笔记#这里孙亿要提一下,使用新浪SDK获得的json字符串和官方网站上略有不同,不用第三方开源包获取到的Json数据是没有statuses的而且第一个字符是[ ],这里注意一下就行,以官方接口为主,可能是接口方法把前面的去掉了。


将上面的数据简化一下就是下面的结构,K代表key,V代表value

[html]    view plain       copy       print       ?  

  1. {  

  2.     K : [     

  3.             {  // 位置1  

  4.                 K : V ,  // 位置2  

  5.                 K : { K : V }  // 位置3  

  6.             },  

  7.             {  // 位置1  

  8.                 K : V ,  // 位置2  

  9.                 K : { K : V }  // 位置3  

  10.             },  

  11.             ......  

  12.         ],  

  13.     K : V    // 位置4  

  14. }  

{
	K : [   
			{  // 位置1
				K : V ,  // 位置2
				K : { K : V }  // 位置3
			},
			{  // 位置1
				K : V ,  // 位置2
				K : { K : V }  // 位置3
			},
			......
		],
	K : V    // 位置4
}



好了,现在我们开始一点一点的去解析它

首先最外面的一层大括号{ ..... },这个应该使用JSONObject()去获取对象

[html]    view plain       copy       print       ?  

  1. JSONObject jsonObject = new JSONObject(json);   

JSONObject jsonObject = new JSONObject(json);


位置1的数据需要一个getJSONArray()方法去获取,因为他是一个数组,[ ]之间的每一个{ ..... }代表数组的一个元素

[html]    view plain       copy       print       ?  

  1. JSONArray statusesArr = jsonObject.getJSONArray("statuses");  

JSONArray statusesArr = jsonObject.getJSONArray("statuses");

此时位置1的元素需要将其转化为JsonObject类

此时有2种办法可以转化

第一种:

[html]    view plain       copy       print       ?  

  1. JSONObject statusesObj = statusesArr.getJSONObject(0);  // 这里的0代表的就是第一个{},以此类推  

JSONObject statusesObj = statusesArr.getJSONObject(0);  // 这里的0代表的就是第一个{},以此类推


第二种:

[html]    view plain       copy       print       ?  

  1. String statusesStr = statusesArr.getString(0);  

  2. JSONObject statusesObj = new JSONObject(statusesStr);  

String statusesStr = statusesArr.getString(0);
JSONObject statusesObj = new JSONObject(statusesStr);


这个时候我们就可以获取位置2的数据了

[html]    view plain       copy       print       ?  

  1. statusesObj.getString("created_at");  

statusesObj.getString("created_at");


位置3的数据又有点比较搞了,直接贴代码

[html]    view plain       copy       print       ?  

  1. String user = statusesObj.getString("user"); // 获取位置3的值  

  2. JSONObject userObj = new JSONObject(user); // 将其转化为JSONObject  

  3. String name = userObj.getString("name"); // 使用get方法获取数据  

String user = statusesObj.getString("user"); // 获取位置3的值
JSONObject userObj = new JSONObject(user); // 将其转化为JSONObject
String name = userObj.getString("name"); // 使用get方法获取数据


位置4的数据获取很简单,使用普通的get方法就可以获得

[html]    view plain       copy       print       ?  

  1. jsonObject.getInt("total_number");  

     

Java解析Json

 

包支持:org.json.jar

第一个:

String js = "{'a':'111','b':'333','c':'666'}";
   try {
    JSONObject jsonObject01 = new JSONObject(js);
    String a = jsonObject01.getString("a");
    String b = jsonObject01.getString("b");
    String c = jsonObject01.getString("c");
   
    System.out.println(a+b+c);
   } catch (JSONException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
  

第二个:

String json = "{'name': '呵呵','array':[{'a':'111','b':'222','c':'333'},{},{'a':'999'}],'address':'上海'}";
   try {
    JSONObject jsonObject = new JSONObject(json);
    String name = jsonObject.getString("name");
    String address = jsonObject.getString("address");

    System.out.println("name is:" + name);

    System.out.println("address is:" + address);
   
    JSONArray jsonArray = jsonObject.getJSONArray("array");
   
    for (int i = 0; i < jsonArray.length(); i++) {
     System.out.println("item " + i + " :" + jsonArray.getString(i));
    }
   } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

© 著作权归作者所有

共有 人打赏支持
y
粉丝 2
博文 41
码字总数 71902
作品 0
海淀
python爬虫抓取新浪微博数据

需求分析 抓取 琢磨先生的新浪微博 抓取的内容包括:微博发布的时间,正文(仅提取文字),转发数,评论数,点赞数 数据是怎么加载的 新浪微博的数据是用ajax异步下拉加载的,在chrome的调试模...

章鱼喵_
08/24
0
0
httpclient模拟手机微博登录问题

由于项目需要提取微博的数据,新浪的API有访问限制,所以想用httpclient模拟登陆,由于web网页的信息貌似用的JSON,我不会解析。所以转向wap页面的解析,参照http://blog.csdn.net/pf149253...

饶培泽
2012/06/13
1K
3
ajax返回什么格式数据好:json,xml,html?

之所以产生这个疑问,是因为我之前用ajax都是返回json格式的数据,但后来发现,很多网站用ajax返回的是html代码,比如新浪微博,腾讯微博等等 我想问的是,为什么他们不 只返回数据,然后在前台用j...

wartskcaj
2012/02/06
6.3K
13
HtmlUnit 网络爬虫 菜鸟的学习笔记(二)

这次我以爬新浪微博为例,这个过程太纠结了,参考了好多大神的帖子,不过还是遗留了很多问题,我们慢慢来看,希望大神帮于指正,我的方法暂时来说还是比较挫的 登陆问题 爬新浪微博首先要登陆...

木有芒果
2015/09/01
0
1
爬虫课程(十二)|ajax分析法(微博):通过获取api爬取新浪微博内容数据实战

一、回顾 我们之前利用Scrapy爬取豆瓣网站信息时,直接通过加载目标URL返回的Response得到想要的值。我也在后面爬取知乎网站时通过模拟登录的方式进入到目标URL,也是通过返回的Response得到...

小怪聊职场
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
24分钟前
0
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
50分钟前
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
51分钟前
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
55分钟前
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部