上月总结最近关注的关键词1110
P3P:浏览器记录Cookie时的关注关键词,部署有啊机票部分Cookie无法获取
推荐 http://ipneter.blog.51cto.com/341177/150968
协调过滤、聚类、特征值、切词:基础数据分析关键词
Mybase:时间管理工具
todoList:优秀任务管理软件
DynaTrack:优秀IE浏览器性能分析工具
PDCA:戴明环,科学管理做事方法
Idashboards:不错的数据展现工具
推荐 http://www.idashboards.com/
网络营销顾问:贾思军博客
推荐 http://jiasijun.com
如何做好BI项目经理,怎样带好你的团队
看到一篇很好的帖子,和大家分享一下。
顺便分享一下一个不错网站 http://www.cognoschina.net/
最近一直再考虑作为项目经理是对客户负责,还是对自己的团队负责?很多BI项目经理都遇到过鸡肋的事。
第一种:有很多项目经理是一些都听客户的,客户要什么样的东西,咱们就提供给客户什么样的东西。及时是不合理,只要客户满意。宁可带领自己的团队天天加 班、日日熬夜也要完成顾客是上帝的这个宗旨。导致自己团队的成员一个个都怨气不断。但是客户却很happy的大笔一挥将单子签下,给公司带来利润。公司领 导满意,让公司得到效益,并且使项目组拿到奖金。
第二种:不遵循客户是上帝,客户的无理要求决不答应,并且给客户提供其他办法,不让自己的团队天天加班、日日熬夜。与客户沟通希望客户理解自己这边的困 难。这种情况如果遇到顽固派的客户,可能会闹得很僵,导致客户对公司做事不满意。令公司蒙受损失,没准会丢失掉一个大客户。
以上是BI项目经理最长碰到的事情,如果你是BI项目经理你会选择哪一种呢?
PS:精辟的回答,受益匪浅
1.楼主这个问题,个人认为是非常有难度的工作!也只有在工作承担了相应的职责的人才能遇到此类问题。这个问题在现实生活中,其实每天都发生着,只不过大部分人并不去问如何才是最佳,而只是达到公司或者项目的表面目标就可以了。
对于这个问题,个人赞成的做法是努力保持客户、公司、团队成员的三者利益平衡,无论哪一方过分吃亏,其实长远的合作就会出问题。比如有人退出团队,其实公司和客户的潜在利益也会受损失。
具体的技巧就是充分洞察各方的真正利益点是什么,作为项目经理要尽最大可能帮助大家各取所需。呵呵,像不像中介?其实,个人感觉就是这样。所以项目经理 在这期间最关键的就是发现各方真正关心的利益点并且努力保证各方能够明白这一点并取得一致意见。如果碰到有些不明白事的,就需要项目经理自己进行一些策划 和组织了,总之,这件事不容易,但是对于项目经理的锻炼是非常有益的,好好干吧。
2.其实这个话题 值得讨论的地方就是一个方法问题 重点在于平衡三方利益。这个工作 已经脱离了技术层面 从管理的角度出发了。以后你遇到这个问题 就会深有体会 并不是做好技术 一切就会好 人际关系这块 非常的复杂 要让所有人都利益最大化 这个项目才能算是一个成功的项目 也会为以后的项目打好基础 你在公司的晋升才会有保证 领导才会将更多的重要工作交给你来做
制作标签云页面の模板标签-wp_tag_cloud()
说明
该标签于WordPress 2.3版本投入使用,可在所谓的“标签云”中显示多个标签,所显示标签的大小取决于该标签的使用频率。WordPress 2.8中的wp_tag_cloud引入了taxonomy参数,使分类法被用作云的产生基础。这意味着,例如,你可以通过wp_tag_cloud向访 问者展示文章的分类云。
用法
<?php wp_tag_cloud( $args ); ?>
默认用法
<?php $args = array( 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45, 'format' => 'flat', 'separator' => '\n', 'orderby' => 'name', 'order' => 'ASC', 'exclude' => , 'include' => , 'link' => 'view', 'taxonomy' => 'post_tag', 'echo' => true ); ?>
默认情况下所显示的结果:
- smallest —— 最小的标签(使用次数最少)显示大小为8
- largest ——最大的标签(使用次数最多)显示大小为22
- unit —— 最大值最小值的单位为'pt'
- number —— 至多显示45个标签
- format —— 以平面形式显示所有标签(标签之间用空格隔开)
- separator —— 显示标签之间的空格
- orderby —— 按名称为标签排序
- order —— 以升序排列
- exclude —— 不排除任何标签
- include —— 包括所有标签
- link —— 可视
- taxonomy —— 用文章的标签作为云基础
- echo —— 响应结果
参数
smallest
(整数)(可选)使用次数最少的标签的字号大小(单位由unit参数决定)
默认值:8
largest
(整数)(可选)使用次数最多的标签的字号大小(单位由unit参数决定)
默认值:22
unit
(字符串)(可选)对smallest与largest的值的测量单位。可以是任何CSS长度单位,如pt, px, em, %。
默认值:'pt'
number
(整数)(可选)显示在云中的实际标签数。(值为'0'时显示所有标签)
默认值:45
format
(字符串)(可选)所显示的云的格式。
- 'flat' (默认值)标签被“separator”参数所定义的空格分隔
- 'list' 标签与class='wp-tag-cloud' 共同在UL中
- 'array' 标签在数组中,函数以数组方式返回标签云,以用在PHP中。注意:数组被返回,而非显示,引入于WordPress 2.5。
separator
(字符串)(可选)标签之间的文本/空格。注意:该参数引入于WordPress 2.9。
默认值:'/n' (空格)
orderby
(字符串)(可选)标签的排列顺序。有效值包括:
- 'name' (默认值)
- 'count'
order
(字符串)(可选)排列顺序(升序或降序)。有效值包括——必须大写:
- 'ASC' ——默认值
- 'DESC'
- 'RAND' —— 以任意顺序排列标签。注意:该标签引入于WordPress 2.5。
exclude
(字符串)(可选)将要被排除的标签(term_id)的ID,各ID用逗号隔开。如 'exclude=5,27'表示不显示term_id为5或27的标签。默认值为不排除任何标签。
include
(字符串)(可选)要包含的标签(term_id)列表,各ID用逗号隔开。例如, 'include=5,27' 表示只显示term_id为5或27的标签。默认为包含所有链接。
link
(字符串)(可选)设置链接,允许编辑某个指定标签。注意:该标签引入于WordPress 2.7。有效值包括:
- 'view' (默认值)
- 'edit'
taxonomy
(字符串)(可选)用以生成云的分类法。注意:该标签引入于WordPress2.8。
- 'post_tag' —— (默认值)将文章标签当作云的来源
- 'category' —— 用文章分类生成云
- 'link_category' —— 用链接分类目录生成云
echo
(布尔型)(可选)显示结果,或将结果保留在变量中。默认值为true(显示标签云)。注意:该标签引入于WordPress2.8。有效值包括:
- 1 (true) —— 默认值
- 0 (false)
示例
显示常用标签标题的云
<?php if ( function_exists('wp_tag_cloud') ) : ?>
<li>
<h2>Popular Tags</h2>
<ul>
<?php wp_tag_cloud('smallest=8&largest=22'); ?>
</ul>
</li>
<?php endif; ?>
限制标签大小且以使用次数而非名称排列标签的云
<?php wp_tag_cloud('smallest=8&largest=22&number=30&orderby=count'); ?>
以数组形式返回云,但不显示
在变量$tag中包含标签云,以用在其它PHP代码中
<?php $tag = wp_tag_cloud('format=array' );?>
创建标签存档
WordPress 2.3新增了一个显著功能——标签,wp_tag_cloud标签可用来展示一个标签存档索引。这就表示,访问者在显示标签云的页面上点击某个标签时,该标签所属的所有文章都会展示在页面上。根据模板层级,如果tag.php模板不存在,那么就使用archives.php模板。通过tag,php模板你可以自定义标签存档索引的样式,为方便导航,模板会在最上方包含标签云。
要将标签云显示在模板上方,你需要将一个新模板添加到主题文件中。模板、模板层级中有相关介绍。基础步骤包括:
1. 用下面的内容创建一个文件,命名为tag.php
2. 将新文件上传到主题目录下
3. 如果你希望在页面导航中加入一个指向标签索引的链接,可进行第三步骤,否则点击某个标签时会使用新模板。
- 用新模板新建一个空白页面,将页面命名为标签存档索引。
对第三步的进一步阐述:
WordPress可为不同页面使用不同页面模板。在页面>添加新页面界面的最下方(或是侧边栏,取决于你安装的WordPress版本)有一个名为“页面模板”的下拉式菜单。你可以在这里选择显示某个页面所用的模板。
<?php /*
Template Name: Tag Archive
*/ ?>
<div>
<?php get_header(); ?>
<h2>Tag Archive</h2>
<?php wp_tag_cloud(''); ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('? Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries ?') ?></div>
</div>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
<div class="entry">
<?php the_content('Read the rest of this entry ?'); ?>
</div>
<?php endwhile; ?>
<?php endif; ?>
</div>
<?php get_footer(); ?>
注意,模板还没有添加样式。通过查看single.php主题文件可以了解你的主题所用的结构。
BI项目团队建设
核心团队是主力。一个项目的主力团队应该是自己组织的成员,每个成员都应该是工作可交付、参与决定、参与讨论和项目的核心领导。核心团队在项目的每个步骤都一直是项目的核心。
项 目的核心成员必须百分之百的全程参与项目,担任主要角色。更重要的是,他们领导着项目。核心团队最合适的规模是四五个人,不要超过七人。团队的成员应该 有:一个项目经理、一个业务代表、一个IT部门的业务分析人员(数据管理员或者业务联系人)、IT部门的资深技术人员(系统分析或者高集程序员)。
注意:业务人员能够全职是项目成功的重要因素。如果业务人员阻碍了BI项目,那么就失去了组织交互的关键的业务驱动力。
开发步骤的核心成员必须百分之百的参与项目,开发的每一步骤都需要他们全职工作。例如,ETL开发组长必须全力领导ETL开发轨迹。
所有的核心成员都参与集体讨论,互相分配任务,回顾每个成员的可交付的工作,解决问题,集体做项目的决策。
核心团队的成员有可能担任多个角色,不论他们是项目的核心成员还是开发步骤的核心成员。
业务代表的角色通常是BI项目需求的业务部门的主要人员。它全程参与BI项目。如果有必要,这个角色应该负有更重要的责任,那就是激励所有的人全力去完成BI项目。
下表列出了核心团队的角色和职责(排名部分先后):
Role |
Major Responsibilities |
应用开发组长 |
设计并且检查开发分析应用(例如,报表、查询等) |
BI基础架构师 |
建立并维护BI基础设施(一些组织中,监督非技术设施);外围团队的组织和管理 |
业务代表 |
参与建模,提供数据定义,写测试案例,做业务决策,解决业务单位之间的分歧,改善数据质量。 |
数据管理员 |
执行组织交互的数据分析,创建逻辑数据模型,将逻辑数据模型合并为企业范围的逻辑数据模型 |
数据挖掘专家 |
选择并且使用数据挖掘工具,应该具有统计背景 |
数据质量分析员 |
评估数据源的质量并且为ETL过程准备数据清洗的规范 |
数据库管理员 |
BI目标数据库的设计、加载、监控、调优 |
ETL组长 |
设计和检查ETL过程 |
元数据管理员 |
自己创建或者购买,提高、加载和维护元数据库 |
项目经理 |
定义、计划、协调、控制和检查所有的项目活动; 跟踪和报告进度;解决技术和业务问题; 指导团队成员;跟供应商、业务人员、项目发起者谈判;项目的职责 |
主题内容专家 |
提供关于数据、流程、需求的业务知识 |
有一些角色是可以合并的,有一些角色是相互排斥的。
例如,一个人可以兼任下面几个角色:
1、应用开发组长和ETL组长(假定这个人有这两方面的知识)
2、数据管理员、数据质量分析员和元数据管理员(假定这个人有所需的知识)
3、数据质量分析员、主题内容专家和业务代表
下面的列表是互相排斥的角色,不能指派给一个人.
·数据管理员和数据库管理员:数据管理员提出独立于流程的逻辑数据模型,数据库管理员提出独立于逻辑数据模型的物理数据模型。一个人来执行这两项工作太困难了,即使这个人具有所需要的知识。
·项目经理和任何非领导角色:管理一个BI决策支持项目必须是全职的工作,不能放到任何开发工作之后.一个人不可能将工作简单的划分给管理和开发。
BI价值的思考
最近一直在思考一个问题,大家伙一直在搞BI,折腾BI,推广BI,但BI的价值在哪里?
目前能看到价值如下(包含但不完整):
1 提供日常工作报表,提升工作效率
2 为数据挖掘准备了高质量的数据
3 为独立的数据集市(ACRM、风险等)准备了高质量的数据
4 解决了在BI系统建立之前的数据孤岛
5 提升了企业数据质量
6 推动了企业数据流的透明化
7 逐步增强了企业对风险的管理
8 支持了领导快速决策
。。。。。。。。
等等这些,如果客户是银行业、电信行业或者是零售行业等BI发展相对成熟的行业,这些话是可以用得,但局限于售前的工作,但是否能够达到这个目标,经过多长时间达到这个目标,恐怕要打一个大大的问号
如何实现BI的价值,如何为BI实施过程提供润滑剂,如何与客户高效的、持续的合作,快速的解决项目问题,好像几个不相干的事情,但核心是一样的,让客户看到BI的价值,客户认可,其他的工作就容易的多了
下面说一下我的方法:
1 专业性:业务专业、技术专业
2 前瞻性:要有高度,提出的问题、想法要领先于客户,引导客户
3 积极性:从客户的角度去思考问题,解决问题,而不是从项目成本考虑,这个成本是可以收回的
4 合理:架构合理
5 针对性:让客户感受到,工作的每一个细节都是针对客户的问题
上面都是技术的,关键的还有一个,就是项目价值的推广,调动客户的积极性(尤其是领导层)
电子商务网站数据分析指标、名词定义与解析
网站分析采用指标可能有各种各样,根据网站目标和网站客户不同,可以有许多不同指标来衡量。常用网站分析指标有内容指标和商业指标,内容指标指是衡量访问者活动指标,商业指标是指衡量访问者活动转化为商业利润指标。
一、网站分析内容指标
转换率 Take Rates (Conversions Rates)
计算公式:转换率=进行了相应动作访问量/总访问量
指标意义:衡量网站内容对访问者吸引程度以及网站宣传效果
指标用法:当你在不同方测试新闻订阅、下载链接或注册会员,你可以使用不同链接名称、订阅方式、广告放置、付费搜索链接、付费广告(PPC)等等,看看那种方式是能够保持转换率在上升?如何增强来访者和网站内容相关性?如果这个值上升,说明相关性增强了,反之,则是减弱。
回访者比率 Repeat Visitor Share
计算公式:回访者比率=回访者数/独立访问者数
指标意义:衡量网站内容对访问者吸引程度和网站实用性(出自 业务员网:www.yewuyuan.com),你网站是否有令人感兴趣内容使访问者再次回到你网站。
指标用法:基于访问时长设定和产生报告时间段,这个指标可能会有很大不同。绝大多数网站都希望访问者回访,因此都希望这个值在不断提高,如果这个值 在下降,说明网站内容或产品质量没有加强。需要注意是,一旦你选定了一个时长和时间段,就要使用相同参数来产生你报告,否则就失去比较意义。
积极访问者比率 Heavy User Share
计算公式:积极用户比率=访问超过11页用户/总访问数
指标意义:衡量有多少访问者是对网站内容高度兴趣
指标用法:如果你网站针对正确目标受众并且网站使用方便,你可以看到这个指标应该是不断上升。如果你网站是内容型,你可以针对不同类别内容来区分不同积极访问者,当然你也可以定义20页以上才算是积极访问者。
忠实访问者比率 Committed Visitor Share
计算公式:访问时间在19分钟以上用户数/总用户数
指标意义:和上一个指标意义相同,只是使用停留时间取代浏览页数,取决于网站目标,你可以使用两个中一个或结合使用。
指标用法:访问者时长这个指标有很大争议,这个指标应结合其它指标一起使用,例如转换率,但总体来说,较长访问时长意味着用户喜欢呆在你网站,高忠实访问率当然是较好。同样,访问时长也可以根据不同需要自行设定。
忠实访问者指数 Committed Visitor Index
计算公式:忠实访问者指数=大于19分钟访问页数/大于19分钟访问者数
指标意义:指是每个长时间访问者平均访问页数,这是一个重要指标,它结合了页数和时间。
指标用法:如果这个指数较低,那意味着有较长访问时间但是较低访问页面(也许访问者正好离开吃饭去了)。通常都希望看到这个指数有较高值,如果你修改了网站,增加了网站功能和资料,吸引更多忠实访问者留在网站并浏览内容,这个指数就会上升。
忠实访问者量 Committed Visitor Volume
计算公式:忠实访问者量=大于19分钟访问页数/总访问页数
指标意义:长时间访问者所访问页面占所有访问页面数量
指标用法:对于一个靠广告驱动网站,这个指标尤其值注意,因为它代表了总体页面访问质量。如果你有10000访问页数却仅有1%忠实访问者率,这意味着你可能吸引了错误访问者,这些访问者没有啥价值,他们仅仅看一眼你网页就离开了。这是你应该考虑是否广告词语产生了误解。
访问者参与指数 Visitor Engagement Index
计算公式:访问者参与指数=总访问数/独立访问者数
指标意义:这个指标是每个访问者平均会话(session),代表着部分访问者多次访问趋势。
指标用法:与回访者比率不同,这个指标代表着回访者强烈度,如果有一个非常正确目标受众不断回访网站,这个指数将大大高于1;如果没有回访者,指数 将趋近于1,意味着每一个访问者都有一个新会话。这个指数高低取决于网站目标,大部分内容型和商业性网站都希望每个访问者在每周/每月有多个会话 (session);客户服务尤其是投诉之类页面或网站则希望这个指数尽可能接近于1。
回弹率(所有页面)Reject Rate/Bounce Rate
计算公式:回弹率(所有页面)=单页面访问数/总访问数
指标意义:代表着访问者看到仅有一页比率
指标意义:这个指标对于最高进入页面有很重要意义,因为流量就是从这些页面产生,当你对网站导航或布局设计进行调整时尤其要注意到这个参数。总而你是希望这个比率不断下降。
回弹率(首页)Reject Rate/Bounce Rate
计算公式:回弹率(首页)=仅仅访问首页访问数/所有从首页开始访问数
指标意义:这个指标代表所有从首页开始访问者中仅仅看了首页访问者比率
指标意义:这个指标是所有内容型指标中最重要一个,通常我们认为首页是最高进入页面(当然,如果你网站有其他更高进入页面,那么也应该把它加入到追 踪目标中)。对任意一个网站,我们可以想象,如果访问者对首页或最常见进入页面都是一掠而过,说明网站在某一方面有问题。如果针对目标市场是正确,说明是 访问者不能找到他想要东西,或者是网页设计上有问题(包括页面布局、网速、链接文字等等);如果网站设计是可行易用,网站内容可以很容易找到,那么问题可 能出在访问者质量上,即市场问题。
浏览用户比率 Scanning Visitor Share
计算公式:浏览用户比率=少于1分钟访问者数/总访问数
指标意义:这个指标一定程度上衡量网页吸引程度。
指标用法:大部分网站都希望访问者停留超过一分钟,如果这个指标值太高,那么就应该考虑一下网页内容是否过于简单,网站导航菜单是否需要改进。
浏览用户指数 Scanning Visitor Index
计算公式:浏览用户指数=少于1分钟访问页面数/少于1分钟访问者数
指标意义:一分钟内访问者平均访问页数
指标用法:这个指数也接近于1,说明访问者对网站越没兴趣,他们仅仅是瞄一眼就离开了。这也许是导航问题,如果你对导航系统进行了显著改进,应该可以看到这个指数在上升;如果指数还是下降,应该是网站目标市场及使用功能有问题,应该着手解决。
将浏览用户比率和浏览用户指数结合起来使用,可以看出用户是在浏览有用信息还是厌烦而离开。
浏览用户量 Scanning Visitor Volume
计算公式:浏览用户量=少于1分钟浏览页数/所有浏览页数
指标意义:在一分钟内完成访问页面数比率
指标用法:根据网站目标不同,这个指标高低有不同要求,大部分网站希望这个指标降低。如果是搞广告驱动网站,这个指标太高对于长期目标是不利,因为这意味着尽管你通过广告吸引了许多访问者,产生很高访问页数,但是访问者质量却是不高,所能带来收益也就会受到影响。
二、网站分析商业指标
平均订货额 Average Order Amount (AOA)
计算公式:平均订货额=总销售额/总订货数
指标意义:用来衡量网站销售状况好坏
指标用法:将网站访问者转化为买家当然是很重要,同样重要是激励买家在每次访问是购买更多产品。跟踪这个指标可以找到更好改进方法。
转化率 Conversion Rate (CR)
计算公式:转化率=总订货数/总访问量
指标意义:这是一个比较重要指标,衡量网站对每个访问者销售情况
指标用法:通过这个指标你可以看到即使一些微小变化都可能给网站收入带来巨大变化。如果你还能够区分出新、旧访问者所产生订单,那么就可以细化这个指标,对新旧客户进行分别统计。
每访问者销售额 Sales Per Visit (SPV)
计算公式:每访问者销售额=总销售额/总访问数
指标意义:这个指标也是用来衡量网站市场效率
指标用法:这个指标和转化率差不多,只是表现形式不同。
单笔订单成本 Cost per Order (CPO)
计算公式:单笔订单成本=总市场营销开支/总订货数
指标意义:衡量平均订货成本
指标用法:每笔订单营销成本对于网站盈利和现金流都是非常关键。营销成本计算各人有不同标准,有些把全年网站营运费用摊入到每月成本中,有些则不这么做,关键要看那种最适合自己情况。如果能够在不增加市场营销成本情况下提高转化率,这个指标就应该会下降。
再订货率 Repeat Order Rate (ROR)
计算公式:再订货率=现有客户订单数/总订单数
指标意义:用来衡量网站对客户吸引力
指标用法:这个指标高低和客户服务有很大关系,只有满意用户产品体验和服务才能提高这个指标。
单个访问者成本 Cost Per Visit (CPV)
计算公式:单个访问者成本=市场营销费用/总访问数
指标意义:用来衡量网站流量成本
指标用法:这个指标衡量是你市场效率,目标是要降低这个指标而提高SPV,为此要将无效市场营销费用削减,增加有效市场投入。
订单获取差额 Order Acquisition Gap (OAG)
计算公式:订单获取差额=单个访问者成本(CPV)-单笔订单成本(CPO)
指标意义:这是一个衡量市场效率指标,代表着网站所带来访问者和转化访问者之间差异
指标用法:指标值应是一个负值,这是一个测量从非访问者中获客户成本。有两种方法来降低这个差额,当你增强了网站销售能力,CPO就会下降,这个差 额就会缩小,说明网站转化现有流量能力到了加强;同样,CPV可能升高而CPO保持不变或降低,这个差额也会缩小,表明网站所吸引流量都具有较高转化率, 这种情形通常发生在启用了PPC(pay per click)计划。
订单获取率 Order Acquisition Ratio (OAR)
计算公式:订单获取率=单笔订单成本(CPO)/单个访问者成本(CPV)
指标意义:用另一种形式来体现市场效率
指标用法:用比率形式往往比较容易为管理阶层所理解,尤其是财务人员。
每笔产出 Contribution per Order (CON)
计算公式:每笔产出=(平均订货数X平均边际收益)-每笔订单成本
指标意义:每笔订单给你带来现金增加净值
指标用法:公司财务总监总是对这个指标感兴趣,代表了你花了多少钱来赚多少钱。
投资回报率 Return on Investment (ROI)
计算公式: 投资回报率=每笔产出(CON) /每笔订单成本 (CPO)
指标意义: 用来衡量你广告投资回报
指标用法:比较你广告回报率,应该把钱分配给有最高回报率广告,但是这个回报率应当要有时间段限制,比如“25% RIO/每周”和“25% RIO/每年”是有很大差别。
PHP对JSON处理数组的使用
对于JSON(JavaScript Object Notation)大家应该不陌生,它是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于 PHP的serialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。
先从JSON说起,看一个简单的实例。
例一:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
document.write(test.Name + ": " + test.Age);
显示结果:
变量test中{"Name":"Peter","Age":20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。
当然也可以变得复杂些。
例二:
document.write(test.User.Name + ": " + test.Company);
显示结果:
这个例子中User元素中包含了Name和Age。
如果要体现多个User,则需要使用数组,区别于对象的"{}",数组使用"[]"。
例三:
{"User":{"Name":"Peter","Age":20},"Company":"FORD"},
{"User":{"Name":"Li Ming","Age":20},"Company":"Benz"}
];
document.write(test[1].User.Name + ": " + test[1].Company);
//或者使用:document.write(test[1]["User"]["Name"] + ": " + test[1]["Company"]);
显示结果:
通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。
例四:
(
'Peter'=> array
(
'Country'=>'USA',
'Age'=>20
),
'Li Ming'=> array
(
'Country'=>'CHINA',
'Age'=>21
)
);
$serialize_var = serialize($arr);
echo $serialize_var;
显示结果:
这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}为例:
a:2说明这是个有两个元素的数组(array),
s:7:"Country";s:3:"USA";为第一个元素,s:7说明这是有7个字符的字符串(string),
后面i:20;也应该猜得到是整数(integer)20。
再来看一下这个例子,
例五:
{
var $var = 0;
function add(){
echo $var+10;
}
}
$unserialize_var = new test;
$serialize_var = serialize($unserialize_var);
echo $serialize_var;
$unserialize_var = null;
$unserialize_var = unserialize($serialize_var);
$unserialize_var->add();
显示结果:
10
从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法。
那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。
例六:
(
'Name'=>'Peter',
'Age'=>20
);
$jsonencode = json_encode($arr);
echo $jsonencode;
显示结果:
这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。
例七:
$jsondecode = json_decode($var);
print_r($jsondecode);
显示结果:
这的确验证了,在JSON中{"Name":"Peter","Age":20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:
$jsondecode = json_decode($var,true);
print_r($jsondecode);
显示结果:
另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。
通过上面这些例子相信大家对于JSON和PHP的serialize、json_encode都有了初步了解,
结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互功能。
【Python】 如何解析json数据结构
一、JSON的格式:
1,对象:
{name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"}
{ 属性 : 值 , 属性 : 值 , 属性 : 值 }
2,数组是有顺序的值的集合。一个数组开始于"[",结束于"]",值之间用","分隔。
[
{name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"},
{name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.peggy.com"}
]
3, 值可以是字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。
4,json示例:
import json
# Converting Python to JSON
json_object = json.write( python_object )
# Converting JSON to Python
python_object = json.read( json_object )
5,simplejson 示例:
import simplejson
# Converting Python to JSON
json_object = simplejson.dumps( python_object )
# Converting JSON to Python
python_object = simplejson.loads( json_object )
二、python从web接口上查询信息
1,先看个例子
>>> import urllib
>>> url='http://a.bkeep.com/page/api/saInterface/searchServerInfo.htm?serviceTag=729HH2X'
>>> page=urllib.urlopen(url)
>>> data=page.read()
>>> print data //这个就是json的数据结构,str类型
{"total":1,"data":[{"outGuaranteeTime":"","assetsNum":"B50070100007003","cabinet":"H05","deviceModel":"PowerEdge 1950","hostname":"hzshterm1.alibaba.com","logicSite":"中文站","memoryInfo":{"amount":4,"size":8192},"ip":"172.16.20.163","isOnline":true,"useState":"使用中","serviceTag":"729HH2X","cpuInfo":{"amount":2,"masterFrequency":1995,"model":"Intel(R) Xeon(R) CPU E5405 @ 2.00GHz","coreNum":8,"l2CacheSize":6144},"cabinetPositionNum":"","buyTime":"2009-06-29","manageIp":"172.31.58.223","idc":"杭州德胜机房","responsibilityPerson":"张之诚"}],"errorMsg":"","isSuccess":true}
>>> type(data)
<type 'str'>
2,有了json数据结构,我却不知道怎么把它解析出来,幸亏有了李建辉的指导。大概思路是:
首先,json基本上是key/value的,python中就叫字典。既然是字典,那就应该安照读字典的方式去读。
将上面的data转为字典类型,这里用json模块的read方法。
>>> import json
>>> ddata=json.read(data)
>>> ddata
{'isSuccess': True, 'errorMsg': '', 'total': 1, 'data': [{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]}
>>>
看看ddata已经是dict类型了
>>> type(ddata)
<type 'dict'>
其次,我们以读字典中key 为”data”对应的键值
>>> ddata['data'] //查看字典的方法!
[{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}]
>>>type(ddata[‘data’])
<type 'list'>
发现ddata[‘data’]是一个列表,列表就要用序号来查询
>>> ddata['data'][0] //查看列表的方法!
{'isOnline': True, 'idc': '\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf', 'assetsNum': 'B50070100007003', 'responsibilityPerson': '\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a', 'deviceModel': 'PowerEdge 1950', 'serviceTag': '729HH2X', 'ip': '172.16.20.163', 'hostname': 'hzshterm1.alibaba.com', 'manageIp': '172.31.58.223', 'cabinet': 'H05', 'buyTime': '2009-06-29', 'useState': '\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad', 'memoryInfo': {'amount': 4, 'size': 8192}, 'cpuInfo': {'coreNum': 8, 'l2CacheSize': 6144, 'amount': 2, 'model': 'Intel(R) Xeon(R) CPU E5405 @ 2.00GHz', 'masterFrequency': 1995}, 'cabinetPositionNum': '', 'outGuaranteeTime': '', 'logicSite': '\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99'}
>>>
呵呵,ddata[‘data’]列表的0号元素是个字典。。
好,那我们查查key为idc的键值是多少
>>> ddata['data'][0]['idc'] //查看字典的方法!
'\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf'
>>> print ddata['data'][0]['idc'] //呵呵,为什么print搞出来的是汉字呢?
杭州德胜机房
看到这里终于明白怎么解析json数据结构了。。。
那就是”一层一层往下剥”