新手问题 “渲染 xml 和 json 数据” 不太懂

346617552 · 2012年10月09日 · 最后由 cisolarix 回复于 2012年10月10日 · 4406 次阅读
class UsersController < ApplicationController #懂
  def index   #懂
    @users = User.all    #懂
    respond_to do |format|   #不懂
      format.html # index.html.erb
      format.xml  { render :xml => @users}   #不懂
      format.json { render :json => @users}   #不懂 百度JSON 太抽象了
    end
  end
end

百度 XML: XML 与 HTML 的设计区别是:XML 的核心是数据,其重点是数据的内容。而 HTML 被设计用来显示数据,其重点是数据的显示。 XML 和 HTML 语法区别:HTML 的标记不是所有的都需要成对出现,XML 则要求所有的标记必须成对出现;HTML 标记不区分大小写,XML 则 大小敏感,即区分大小写。 结合 XML 的简单使其易于在任何应用程序中读写数据,这使 XML 很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持 XML,那就意味着程序可以更容易的与 Windows,Mac OS,Linux 以及其他平台下产生的信息结合,然后可以很容易加载 XML 数据到程序中并分析他,并以 XML 格式输出结果。

XML 具体是干嘛? (可以形象点吗?) 在 Rails 的 MVC 架构中,哪里要用到?

XML 和 JSON 应该都算是一种以文本方式保存的数据结构。

其实 HTML 也是文本方式的数据结构,它和 XML 的共同点就是都用成对的标签来扩住数据主体(字符串、数字等等)。不过 HTML 的结构并不严谨(但是作为开发者,严谨的写 HTML 标签是好习惯!),这是因为它的目的是用来友好显示数据的,浏览器足够聪明来判断 HTML 的标签结构,并且把它渲染为人类所习惯的显示方式。另外:HTML 是 XML 的子集,这一点值得注意。

如果说 HTML 是用来给人看的,那么 XML 就是用来给机器看的。因为 XML 对格式要求十分严格,所以计算机语言可以很准确的解析 XML 数据结构,并获取它需要的数据部分。

为什么要 XML?因为大量的数据直接写在源程序里既不好读也容易出错,当程序处理需要外来数据的时候,我们就可以把数据保存在像 XML 这样的文件内通过外部加载,个人觉得这其实有点“数据封装”的意思。

JSON 呢?JSON 其实就是 JavaScript 的对象,因为它简洁优秀的数据结构表达形式,使得它逐渐成为程序员首选的数据结构封装格式;并且由于它对 JavaScript 的天然友好性,它更适合于在 web app 里作为数据结构的外部封装。

前面说得太抽象了。举个例子,你做了一个 web app,然后你封装了一些 API 允许把这个 app 里产生的数据暴露出去,这样其他的网站或者手机应用就可以通过你的 API 获得你网站里的数据,其他开发者就可以引用这些数据重新渲染显示在他们自己的网站或者手机应用中。

问题是,你的数据用什么形式发给他们?直接给 HTML 文件?这显然不靠谱。因为:1) HTML 的标签是不严谨的(至少可以写的不严谨,比如缺少关闭标签,混乱的多层嵌套等等——这对浏览器不成问题,它们都很宽松,但是对于写程序的时候来解析数据就是大问题了);2) 如果直接把你的 HTML 结构发给他们,一旦对方想改一下这些数据在页面上的显示结构就会很麻烦了,对于使用你的 API 的人来说,他们只希望要数据本身,而不是封装数据的结构标签。

所以 XML 和 JSON 就是更好的选择,而且对于 web 相关的应用来说,JSON 更胜一筹;而对于其他的一些应用平台,比如 RSS,那么 XML 可能就足够合适了。

因此,Rails 的respond_to方法允许我们同时渲染多种格式出去,这为我们对外暴露数据提供了很大的便利——你不用自己去写外部数据封装的方法了。像你上面的例子,对于@user这个对象里包含的所有属性,当你通过浏览器访问.html后缀,看到的就是网页(实际中不需要后缀,这是因为router定义了获取数据的 URL,如http://myapp.com/users);访问.json即可以获得 JSON 格式的相同数据,XML 亦然。

最后请看看来自 Github 的范例:

https://github.com/nightire https://github.com/nightire.json

Plus,推荐 LZ 看一个视频教程,来自 PeepCode 的: https://peepcode.com/products/play-by-play-tenderlove-ruby-on-rails

在这部视频里,Aaron Patterson 演示了一个小型 Rails 应用的开发过程,这个应用要求获取指定用户在 Github 上的活动详情,并对不同的活动计分,最终统计出这个用户的总得分。你可以看到 Aaron 是如何利用 Github 提供给我们的 JSON 数据的,包括如何获取,如何解析,如何分解数据然后保存在数据库对应的表中等等等等,相信会让你豁然开朗。

@nightire 非常感谢!看得两眼闪烁~范例以及视频我等下就看,至少知道自己在看东西到底是什么了,心情爽朗了很多啊~Please accept my whole-hearted thanks.

要 Google 不要百度。

#3 楼 @Rei Yeeeeeeeeeeeeeeeeeeeeeeeeeees! ; )

匿名 #6 2012年10月10日

其实,你就在你的 url 后面加上.json 或者.xml 你就知道,它们干啥的了。

xml/json 就好象在扔飞镖,html 就是打中了你的情况

#1 楼 @nightire 拜读了阁下的”回炉再造——浮动“篇。讲得深入浅出。很是佩服。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号