JavaScript 代码 的数据输入模型,在序列化日期时,选择非常有限。我可以:将日期转换为日期的 JavaScript toString 序列(例如,2007 年 10 月 21 日 星期日 12:34:28 GMT-0700 (PDT)) 按日期在 Atom 文档中的呈现形式对其进行复制。
前两个选项可以在 JavaScript 中处理,不需要开发人员做太多的工作。也就是说,要获得正确的 JavaScript Date 对象,只需调用新的 Date(feed.updated)。但是,其缺点是,使用第一个选项会丢失与毫秒数和时区偏移有关的重要信息;
如果使用第二个选项,日期的 toString 序列会因实现和地区的不同而不同。尽管使用 RFC 3339 序列需要额外的工作,但这是避免数据丢失和数据含义不明的惟一选项。
文本结构
Atom 支持大量的文本和内容选项,到目前为止,这是在 JSON 序列化过程中碰到的最复杂最困难的问题。文本结构,比如 title、subtitle、summary 和 rights 元素,可以包含纯文本、转义 HTML 或JavaScript 代码;这些结构具有语言敏感性,因此必须考虑 xml:lang 属性;#t#
而且 HTML 和 XHTML 标记可以包含需要解析的相对 URI。由于 Atom content 元素支持 Base64 编码的内容、任意 XML 标记和使用 src 属性引用的外部内容,这使得序列化过程更加困难。
对 Atom 内容进行 JSON 序列化的目的是找到一种通用的表示方法,该方法能够尽可能一致地捕获这些选项。清单 18 展示了一个带有 3 种文本结构的提要示例。
- <updated>2007-10-14T12:12:12Z</updated>
title 元素为纯文本。它需要继承提要的语言上下文,否则不具备描述性。subtitle 元素包含转义的 HTML 标记。right 元素也是纯文本,但它覆盖了语言上下文。清单 19 展示了这 3 个元素的JavaScript 代码。
- <feed xmlns="http://www.w3.org/2005/Atom"> ...
- <title>Example Feed</title> <subtitle type="html"><p>This is an example feed</p></subtitle>
- <rights xml:lang="fr">...</right> ...</feed>
注意,这只是最简单的情形,title 被序列化为一个简单字符串。但是,由于 right 元素中的语言上下文时刻都会变化,所以尽管它是纯文本,也被序列化为包含两个字段(attributes 和 children)的对象。
对于 subtitle 元素,JavaScript 代码标记被解析并呈现为一种分层结构。XHTML 标记也使用相同的结构(清单 20 和 21)。
- { "title":"Example Feed", "subtitle":{ "attributes":{ "type":"html" },
- "children":[ { "name":"p", "attributes":{ }, "children":["This is an
- example feed" ] } ] }, "rights":{ "attributes":{ "lang":"fr" },
- "children":[ "..." ] } }