构建 pureXML 和 JSON 应用程序,第 1 部分: 使用 DB2 pureXML 储存和查询 JSON

采用简单的 JSON-to-XML 映射

JavaScript Object Notation (JSON) 是 Web 2.0 中最流行的文本表示法,用于在客户机和服务器交换信息时将对象(或数据结构)表示为序列化文本。一些应用程序通过持久化 JSON 对象来更好地跨多个会话维护状态。在本文中,了解在采用简单的 JSON-to-XML 映射时 DB2® pureXML® 如何储存、管理和查询 JSON。

Nuno Job, DB2 Technical Enablement 专家, IBM  

Nuno Job 的照片Nuno Job 是 University of Minho 的研究生,他曾经在 IBM 的 T.J. Watson Research Center 的 pureXML 支持团队实习。他感兴趣的领域包括开放源码技术、Linux、安全、隐私、Web 和结构化数据库。Nuno 当前在多伦多的 IBM 担任 DB2 Technical Enablement 专家,帮助客户验证 IBM 合作伙伴计划和维护 IBM Ruby on Rails 应用程序。



Susan Malaika, 高级技术人员, IBM

Susan Malaika 的照片Susan Malaika 是 IBM Information Management Group(属于 IBM Software Group)的一名高级技术人员。她的专长包括 XML、Web 和数据库。她曾在 Global Grid Forum 开发过支持网格环境数据的标准。她与人合作出版了关于 Web 的专著,发表了关于事务处理和 XML 的文章。她是 IBM Academy of Technology 的成员。



Michael Schenker, 软件工程师, IBM  

Michael SchenkerMichael Schenker 是加州 San Jose 的 IBM Silicon Valley Laboratory 的软件工程师。他于 2002 年加入 IBM,从事 IBM Data Server Tooling 领域。他专长的领域是在 IBM 数据服务器上启用 Web 服务。他从德国 Leipzig 的 University of Applied Sciences 获得了计算机科学硕士学位。



2009 年 11 月 30 日

简介

常用术语

  • Ajax:异步 JavaScript + XML
  • API:应用编程接口
  • DBMS:数据库管理系统
  • DOM:文档对象模型
  • HTTP:超文本传输协议
  • IETF:互联网工程任务组
  • RFC:请求注解
  • RSS:真正简单的联合
  • SAX:Simple API for XML
  • SOA:面向服务架构
  • W3C:万维网联盟
  • XHTML:可扩展超文本标记语言
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

JavaScript(在 ECMA 中的 ECMAScript Language Specification 中定义)是在 Netscape Navigator(Web 浏览器)中首次实现的脚本语言,其目的是提高 Web 页面的处理速度。JSON(在 IETF 的 RFC 4627 中定义)是一种用于将 JavaScript 数据结构(比如对象和结构)表示为序列化文本的格式。

尽管 XML(在 W3C 的 XML 1.0 规范中定义)是在松散耦合的客户机和服务器之间交换消息时经常使用的表示格式,JSON 也常常用于完成相同的任务。采用 JSON 的原因之一是可以使用脚本语言轻松地操作 JSON 对象,比如 JavaScript、Python 或 Ruby。

随着 XML 被广泛用于数据交换,开始出现了在数据库中储存和查询 XML 的想法。现在,操作和交换 JSON 变得越来越常见,但还没有储存它。不过,面向文档的 JSON 数据库管理系统开始出现。例如,Apache CouchDB 在接口和储存方面与 JSON 高度保持一致。

在本文中,我们引入了将 JSON 交换为 XML 的概念,以利用 XML 处理器、XML 工具、XML 储存(通常出现在 XML 数据库中,比如 DB2 pureXML)和其他 XML 技术,比如 XQuery 和 XSLT。为了实现该目的,我们引入了一个称为 JSONx 的 XML 格式、描述了一个友好的 JSON-to-XML 表示法,并解释了 JSONx 和友好格式之间的区别。

通过遵循本文介绍的步骤并利用附带的下载文件,您可以以 DB2 pureXML 样例数据库为基础,构建一个可查询的带索引 JSON 储存。本文是共包含 3 部分的系列文章的第一部分,该系列展示如何构建一个基于 JSON 的、包含 JSON、Web 服务和 OpenSocial 小部件的 3 层 pureXML 应用程序。

图 1. Universal Services 架构概述
Universal Services 架构图表,包含用户接口、JSON Universal Services 和数据

Universal Services 是一组简单但固定的数据库操作,它们允许查询和修改储存在 DB2 数据库的 pureXML 列中的数据。这些数据库操作允许您插入、更新、删除和查询通过 Data Web Service 公开为 Web 服务的数据。参见 参考资料 了解更多关于 Universal Services for pureXML 的信息。JSON Universal Services for pureXML 向客户机公开相同的数据库操作,但使用的是 JSON 而不是 XML,不过继续在服务器端使用 XML。客户端应用程序不知道入站和出站的 JSON 在服务器端的数据库中被转换成 XML。

本文还探索了将 JSON 表示为 XML 的其他的选择,然后描述一些场景以及如何在这些场景中应用 DB2 pureXML。本文附带了一个下载文件(名为 JSONx 包),您可以使用它构建一个样例 JSONx pureXML 数据库。它构成 JSONx 应用程序的基础。下载文件中包含了两个用户定义的 DB2 函数,用于在 JSON 和 JSONx 之间实现转换。

JSON

JSON 是一种基于文本并且人类可读的格式,用于在客户机和服务器之间交换数据。它为开发人员提供一种可以直接映射到他们使用的数据结构的格式。为了实现该目的,JSON 定义了以下主要数据结构:数字、字符串、布尔值(真或假)、数组(值的有序排列)、对象(键值对集合)和 null。

清单 1 展示了一个描述客户的 JSON 对象。customerinfo 对象内部嵌套了两个对象,它们定义客户 ID(cid)和名称。customerinfo 对象还包含两个结构化对象,用于定义客户地址和电话号码。

清单 1. 用 JSON 表示客户 Kathy Smith 的信息
{
  "customerinfo" : {
	"cid" : 1000 ,
	"name" : "Kathy Smith" ,
	"addr" : {
	  "country"    : "Canada" ,
	  "street"     : "5 Rosewood" ,
	  "city"       : "Toronto" ,
	  "prov-state" : "Ontario" ,
	  "pcode-zip"  : "M6W 1E6"
	} ,
	"phone" : {
	  "work" : "416-555-1358"
	}
  }
}

一个典型的 JSON 场景

JSON 的一个典型用例是让 Web 应用程序与某个 API 交换数据,比如 Yahoo Web Services 或 Twitter API。在这种场景中,Web 应用程序利用异步 JavaScript 请求 (Ajax) 让 JSON 与公开 API 的 Web 服务通信。

通常情况下,这样的 API 允许应用程序选择交换格式。常见的支持格式包括 XML 和预定义的 XML 标准,比如 RSS、Atom 和 JSON。要获得这些格式的例子,请参考 附录 A

能够自由选择应用程序与 Web 服务交换数据的格式可以加快开发人员的开发流程。不过,这会导致维护同时支持多种格式的基础设施的问题。下表列出了数据储存的一些选项:

  • 使用基于文档的 JSON 数据库,比如 Apache CouchDB。
  • 通过为每个请求分割和重构 JSON 使用关系数据库。
  • 使用 XML 原生储存(储存 JSONx)并提供公开和处理 JSON 的接口。

图 2 展示了针对这些数据储存选项的例子(查看 图 2 的大图)。

图 2. 储存 JSON 的不同方式
储存 JSON 的 3 种方式:JSON 数据库、关系数据库或作为 JSONx(XML 储存)

这 3 种方法各有其优缺点。本文不分析它们的差异,而是重点描述这样一个场景:对特定应用程序而言,使用 pureXML 是最便捷的。使 XML 成为最便捷的方式的原因包括:

  • 其余的基础设施已经使用 XML 和 SOA
  • 存在 XML 工具(比如 IBM Websphere® DataPower®)和可以扩展为兼容 JSONx 的 XML 技术

比较 JSON 和 XML

当开发人员使用 XML 交换数据时,他们通过 XML DOM 或 SAX 导航 XML。对相同的 JSON 数据结构进行处理以操作和交换数据的能力简化了开发流程,因为这能够用应用程序的宿主编程语言以声明的方式访问对象。

XML 的重点是提供一个自定义的交换表示法,该表示法可以和一个可交换的严格模式相关联起来。XML 还提供各种特性,比如名称空间、压缩、数字签名和安全性,以及 XQuery 和 XSLT 等声明式语言,它们可以通过 C、Java™ 和 Ruby 编程语言进行调用,以操作一个或多个 XML 文档。

JSON 不具备 XML 的各种特性。

用 XML 表示 JSON

本文的重点是演示如何生成与任意 JSON 文档同构(结构相等)的 XML 格式,换句话说,如何在任意 JSON 文档和 XML 文档之间创建一个通用的映射。

要在任意 JSON 文档和 XML 文档之间实现有效的映射,您必须考虑这两种格式之间的区别。这个小节探索了一个非常直观但不是同构的 XML 和 JSON 之间的映射。表 1 描述了一个简单的映射例子。

表 1. 友好 XML 的可能映射
样式JSONXML说明
1{"foo" : "bar"} <foo> bar </foo>值类型为 string 的对象
2{"foo" : true} <foo> <true/> </foo>值类型为 true 的对象
3{"foo" : { "true" : null }} <foo> <true/> </foo>其嵌套对象的值类型为 null 的对象
4{"foo bar!" : true} Error: "foo bar!" is not a valid QName值类型错误的对象的转换会失败,因为键包含对 XML QName 非法的字符(比如空格和感叹号)
5{"foo" : null} <foo/>值类型为 null 的对象
6{"foo": { "bar" : null}}<foo> <bar/> </foo> 叶节点类型为 null 的嵌套对象
7{"foo": { "bar" : [null, false]}} <foo> <bar> <null/> <false/></bar></foo> 包含嵌套数组的对象

我们提到一个使用特定于应用程序的元素和属性名的映射表示法作为 JSON 的友好 格式,而不是规范的 JSONx 名称。该映射存在许多缺陷。样式 2 和 3 的结构不相同,但仍然系列化到相同的 XML 文档中,从而导致不能够从生成的 XML 重构相同的 JSON 文档。样式 4 的对象键包含对 XML QName 无效的字符。可以通过一些技术来克服这些限制,但它们的效果不如同构表示法,比如 JSONx。


JSONx

Canonical JSON XML (JSONx) 是作为 JSON 的同构格式引入的。因此在 JSONx 中不存在前面小节中出现的与友好表示法相关的问题。

清单 2 中,您可以看到客户 Kathy Smith 的 JSONx 格式的信息,该信息在 清单 1 中是用 JSON 表示的。

清单 2. 用 JSONx 表示的 Kathy Smith 的客户信息
<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
  <json:object name="customerinfo">
	<json:number name="cid">1000</json:number>
	<json:string name="name">Kathy Smith</json:string>
	<json:object name="addr">
	  <json:string name="country">Canada</json:string>
	  <json:string name="street">5 Rosewood</json:string>
	  <json:string name="city">Toronto</json:string>
	  <json:string name="prov-state">Ontario</json:string>
	  <json:string name="pcode-zip">M6W 1E6</json:string>
	</json:object>
	<json:object name="phone">
	  <json:string name="work">416-555-1358</json:string>
	</json:object>
  </json:object>
</json:object>

JSONx 格式适用于处理 XML 数据但又需要扩展为支持 JSON 的系统。不过,它并不是将 JSON 转换成 XML 的万能解决方案。在前面的例子中,您可以用友好的格式为 Kathy Smith 指定原始信息,如下所示:

清单 3. 用可能的友好格式为 Kathy Smith 指定客户信息
<customerinfo>
  <cid>1000</cid>
  <name>Kathy Smith</name>
  <addr>
	<country>Canada</country>
	<street>5 Rosewood</street>
	<city>Toronto</city>
	<prov-state>Ontario</prov-state>
	<pcode-zip>M6W 1E6</pcode-zip>
  </addr>
  <phone>
	<work>416-555-1358</work>
  </phone>
</customerinfo>

使用 JSONx 取代友好格式能够增强代码重用、通用工具开发、转换和过滤功能,这些功能一般都与使用标准相关。您还可以选择使用 XML 技术(比如 XSLT 和 XQuery)创建一个用更加友好的格式公开文档的视图。

JSONx 允许使用现有的 XML 基础设施,而不需要定制解决方案来处理和储存 JSON。要获得关于 JSONx XML 模式的链接,请查看 参考资料


JSONx 包

这个小节简要描述针对 DB2 pureXML 的 JSONx 包(脚本和代码的集合),并展示如何:

  • 将 JSON 转换成 JSONx
  • 将 JSONx 转换成 JSON
  • 将 JSON 文档作为 JSONx 导入
  • 储存 JSONx
  • 为 JSONx 创建索引以改善性能
  • 以关系格式公开 JSONx
  • 将 JSONx 转换成友好的 XML 表示法
  • 使用 XMLQuery 合并 JSONx 文档(可以选择关系谓词)

该 JSONx 包包含更加详细的解释,请查阅其中的 readme 文件。

先决条件

要安装并运行 JSONx 包,必须先安装了 DB2 v9.5 或更新版本。您可以下载 DB2 Express-C,这个包含 pureXML 的开放版 DB2 可以用作功能齐全的关系和 XML 数据服务器(参考资料 部分包含下载站点的链接)。

尽管这个包也许可以在其他操作系统中运行,但我们仅在 Ubuntu Jaunty Jackalope 9.04 和 Microsoft® Windows® XP SP2 上进行了测试。

表结构

在上一个小节中,我们介绍了 JSON 和 JSONx 格式的关于 Kathy Smith 的客户信息。在 表 2 中,您可以看到储存信息的客户表:

表 2:JSONXMLADMIN.CUSTOMER 表
列名数据类型说明
CID INTEGER 客户 ID
INFOXML 包含关于客户的个人信息的记录
COMMENTVARCHAR(256)关于客户的小文本标识符

JSONx 包中还存在两个其他表:Product 和 PurchaseOrder。

product 表在名为 DESCRIPTION 的列中包含产品信息以及该产品的唯一标识符:

表 3:JSONXMLADMIN.PRODUCT 表
列名数据类型说明
PID INTEGER 产品 ID
DESCRIPTION XML 包含关于产品的个人信息的记录

PurchaseOrder 描述一个客户购买一个或多个产品的事务。关于该表的一个有趣细节是客户标识符没有包含在原始 JSON 文件中,而是包含在一个独立的关系列中。通过使用 JSONx 和 DB2 pureXML,您可以从两个(或多个)不同的 JSON 文档合并数据,也可以使用 JSON 文档合并关系记录。要获得关于如何执行这种合并的例子,请参考包含在 JSONx 包中的过程代码:

表 4:JSONXMLADMIN.PURCHASEORDER 表
列名数据类型描述
POID INTEGER 购买订单 ID
CUSTID INTEGER 相关联的客户 ID
PORDER XML 包含关于购买订单的信息的记录

使用 Java 用户定义函数将 JSON 转换成 JSONx

JSONx 包将在可以实现 JSON 和 JSONx 彼此转换的 DB2 中注册两个 Java 用户定义函数(UDF)。清单 4 显示了一个非常简单的将 JSON 转换成 JSONx 的用户定义函数。

清单 4. 调用 JSONTOXML Java 用户定义函数
SELECT JSONXML.JSONTOXML('{"foo": "bar"}') FROM SYSIBM.SYSDUMMY1

清单 5 显示了来自 清单 4 中的 SELECT 语句的输出。

清单 5. 清单 4 中的调用的输出
<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
 <json:string name="foo"> bar </json:string>
</json:object>

要将 JSONx 转换成 JSON,需要调用 XMLTOJSON 存储过程。清单 6 显示了一个例子,其中在 清单 4 中使用的 JSON 文档被序列化为 JSONx 然后再转换回 JSON。

清单 6. 从 JSON 到 JSONx 再到 JSON
SELECT JSONXML.XMLTOJSON(JSONXML.JSONTOXML('{"foo": "bar"}')) FROM SYSIBM.SYSDUMMY1

合并 JSONx 文档

DB2 pureXML 中激动人心的特性之一是各种合并数据选项。在 DB2 pureXML 中储存 JSONx 意味着您现在可以像合并 XML 文档一样合并 JSON 数据。清单 7 显示了如何使用关系和 XML 谓词合并 JSONx,并为每个 Purchase Order 返回 POID 和客户名。

清单 7. 使用关系和 XML 谓词合并 JSONx
SELECT
  POID, 
  XMLCAST (
	XMLQUERY(
	  ''declare default element namespace "http://www.ibm.com/xmlns/prod/2009/jsonx";
	  data( 
		$INFO/object/object[@name="customerinfo"]/string[@name="name"]/text() )''
	  ) AS VARCHAR(32) 
	) AS CUSTNAME
FROM
  JSONXMLADMIN.PURCHASEORDER , 
  JSONXMLADMIN.CUSTOMER
WHERE
  XMLEXISTS(
	''declare default element namespace "http://www.ibm.com/xmlns/prod/2009/jsonx";
	$INFO/object/object[@name="customerinfo"]/number[@name="cid"][. = $CUSTID]'' 
  )

DB2 9.7

JSONx 包还显示了一些在 DB2 v9.7 pureXML 中添加的新特性。当在 JSONx 文档上创建一个包含 XMLTABLE 的视图时,DB2 v9.7 将选择适用的 XML 索引,从而让查询更加快。

清单 8. 将 JSON 公开为一个带有 XMLTable 的关系视图
CREATE VIEW JSONXMLADMIN.RELCUSTOMER(CID, NAME, PHONE) AS 
 SELECT  *
 FROM
  XMLTABLE(
   XMLNAMESPACES (DEFAULT 'http://www.ibm.com/xmlns/prod/2009/jsonx'),
   'db2-fn:xmlcolumn("JSONXMLADMIN.CUSTOMER.INFO")'
    COLUMNS
	  "CID" INTEGER 
	  PATH '/object/object[@name="customerinfo"]/number[@name="cid"]/xs:double(.)' ,
	  "NAME" VARCHAR(32) 
	  PATH '/object/object[@name="customerinfo"]/string[@name="name"]/text()' ,
	  "PHONE" VARCHAR(32)
	  PATH '/object/object[@name="customerinfo"]/object[@name="phone"][1]/*[1]/text()'
	)

您还可以使用 SQL/XML 发布函数从关系数据生成 JSONx。

另一个新特性是,在用户定义函数中支持 XML 数据类型允许操作 XML 文档。当使用 DB2 V9.7 运行 JSONx 包时,您将使用另外两个新特性生成输出:视图索引和 XML 用户定义函数。

包含在 JSONx 包中的 UDF 利用 XQuery Update Facility 来将 JSONx 转换成适合表示 JSON 的特定子集的格式,当 JSONx 样例数据库完成之后将导入该 JSON 子集。尽管这并不是一个通用或高效的转换算法,但 清单 9 显示了如何使用 DB2 pureXML 编写高级的 XML 用户定义函数:

清单 9. 用于生成友好 XML 的样例 XML UDF
CREATE FUNCTION JSONXMLADMIN.JSONXTOFRIENDLY(JSONX XML)
RETURNS XML
BEGIN ATOMIC
  RETURN XMLQUERY('
	declare namespace json="http://www.ibm.com/xmlns/prod/2009/jsonx";
	copy $n := $JSONX
	modify(
	  for $e in $n//json:*
	  where $e/@name
	  return (
		do rename $e as replace($e/@name," ", "_") ,
		do delete $e/@name
	  )
	)
	return document { $n/json:object/* }
  ');
END

清单 10 显示了如何将前面转换成友好表示法的客户信息转换回到 JSONx。

清单 10. 将 Kathy Smith 的友好客户信息转换回到 JSONx
SELECT
  XMLQUERY('
	declare namespace json="http://www.ibm.com/xmlns/prod/2009/jsonx";
	copy $n := $friendly
	modify(
	  for $e in $n//*
	  let $name := local-name($e)
	  let $type := 
		if ($name = ("addr", "phone", "customerinfo")) then "json:object"
		else if ($name eq "cid") then "json:number"
		else "json:string"
	  return (
		do rename $e as $type,
		do insert attribute name { $name } into $e
	  )
	)
	return document { 
	  <json:object>
		{ $n } 
	  </json:object>
	}
  ' PASSING JSONXMLADMIN.JSONXTOFRIENDLY(INFO) as "friendly")
  FROM
	JSONXMLADMIN.CUSTOMER
  WHERE
	CID = 1000

运行 JSONx 包

遵从下面列出的步骤安装 JSONx 包:

  • 如果使用的是 Windows 平台,仅需在文件系统的资源部分解压缩 jsonx.zip 文件。如果使用的是 Linux® 平台,使用 unzip -a -aa jsonx.zip 解压缩 jsonx.zip 文件。这将确保使用正确的行终止字符。
  • 在 Windows 系统上,确保初始化了 DB2 命令行处理器环境。在基于 Linux 的系统中,检查您是否作为可以访问 DB2 的用户登录(db2inst1 是默认的 DB2 用户)。
  • 您已经准备好运行该脚本。(注意:开始脚本可能配置了一些 DBMS 参数,它可能停止并重新启动 DBMS 以确保 DBMS 能够处理以 jar 格式储存的过程。如果您担心脚本存在这样的问题,请在运行之前检查它们!)在 Windows 平台上运行 start.bat 文件。在 Linux 平台上,运行 start.sh。在该脚本运行完毕之后,您将在命令行提示符或 bash 处看到类似于图 3 的内容(查看 用文本表示的图 3 的输出)。
图 3. JSONx 包的样例输出
JSONx 包的样例输出

至此,一切设置完毕,您可以在输出文件夹中查看查询结果。要检查创建的结果是否正确,可以将输出文件夹中的输出文件与参考文件夹中的参考输出进行对比。

如果样例输出与参考文件夹不匹配,那么查看日志目录中的日志文件,了解是什么原因导致执行失败。

要查看以友好 XML 和 JSONx 格式表示的来自 Twitter 的 tweet,请查看 附录 A


结束语

本文介绍了一种新的格式(JSONx),它使您能够在 DB2 pureXML 中像存储 XML 一样储存 JSON。本文还概述了 JSONx 和其他友好格式的差异。讨论了 JSON 的典型用例,并突出强调了使用 pureXML 储存 JSON 的好处。最后,借助 JSONx 下载文件(JSONx 包),您可以构建支持 pureXML 的 JSON 应用程序。

本系列的接下来两篇文章将关注通过 JSON Universal Services 公开 JSONx 样例数据库(在 JSONx 包中创建),然后重点阐述如何使用依赖 JSON Universal Services 作为后端的 Open-Social Gadgets 创建表示层。

未来需要考虑的问题是开发人员使用 JSONPath 访问 JSON 文档(储存为 JSONx)的方式。


附录 A

一个典型的 JSON 场景 所述,许多 Web 服务都提供多种格式来显示信息。Atom、RSS、JSON 以及友好的 XML 表示法等行业标准都是这些格式的例子。Twitter 提供一个可以通过 ID 访问 tweet 的 API。在这个附录中,我们显示了向使用 curl 的 Twitter 发出两个请求得到的结果,一个请求的格式为 JSON,另一个为友好的 XML。然后,我们演示如何将友好 XML 转换成 JSONx。

清单 11 中,我们使用 curl 调用发布在 twitter.com 上的个人消息的信息(ID 为 2311383114 的 tweet)。要获取 tweet 信息(它的状态),您可以像 清单 11 那样从您的终端调用 curl,然后就会以 JSON 格式返回 tweet 的状态。(注意:为了保持良好的格式,在清单 1112 中对 curl 的调用分为两行)。

清单 11. 以 JSON 格式获取 ID 为 2311383114 的状态
purexml@watson.ibm.com:~$ curl 
http://purexmltest:3ce3ac99@twitter.com/statuses/show.xml?id=2311383114

{
    "text": "Hello World!",
    "in_reply_to_user_id": null,
    "user": {
        "following": null,
        "favourites_count": 0,
        "profile_sidebar_fill_color": "e0ff92",
        "description": null,
        "verified": false,
        "utc_offset": null,
        "statuses_count": 1,
        "profile_sidebar_border_color": "87bc44",
        "followers_count": 0,
        "created_at": "Wed Jun 24 14:18:32 +0000 2009",
        "url": null,
        "name": "pureXML TEST",
        "friends_count": 0,
        "profile_text_color": "000000",
        "protected": false,
        "profile_image_url": "http:\/\/s3.amazonaws.com\/twitter_production
		\/profile_images\/280225879\/twitterxml-1_bigger_normal.png",
        "profile_background_image_url": "http:\/\/static.twitter.com
		\/images\/themes\/theme1\/bg.gif",
        "notifications": null,
        "time_zone": null,
        "profile_link_color": "0000ff",
        "screen_name": "purexmltest",
        "profile_background_tile": false,
        "profile_background_color": "9ae4e8",
        "location": null,
        "id": 50316451
    },
    "favorited": false,
    "created_at": "Wed Jun 24 15:04:13 +0000 2009",
    "in_reply_to_screen_name": null,
    "truncated": false,
    "id": 2311383114,
    "in_reply_to_status_id": null,
    "source": "web"
}

另外,您也可以以 Atom、RSS 或友好 XML 表示法格式获取相同的文档。在 清单 12 中,您调用相同的函数来获取状态,但状态是友好 XML 格式的:

清单 12. 以友好 XML 格式获取 ID 为 2311383114 的状态
purexml@watson.ibm.com:~$ curl 
http://purexmltest:3ce3ac99@twitter.com/statuses/show.xml?id=2311383114

<?xml version="1.0" encoding="UTF-8"?>
<status>
  <created_at>Wed Jun 24 15:04:13 +0000 2009</created_at>
  <id>2311383114</id>
  <text>Hello World!</text>
  <source>web</source>
  <truncated>false</truncated>
  <in_reply_to_status_id></in_reply_to_status_id>
  <in_reply_to_user_id></in_reply_to_user_id>
  <favorited>false</favorited>
  <in_reply_to_screen_name></in_reply_to_screen_name>
  <user>
    <id>50316451</id>
    <name>pureXML TEST</name>
    <screen_name>purexmltest</screen_name>
    <location></location>
    <description></description>
    <profile_image_url>http://s3.amazonaws.com/twitter_production/
	profile_images/280225879/twitterxml-1_bigger_normal.png</profile_image_url>
    <url></url>
    <protected>false</protected>
    <followers_count>0</followers_count>
    <profile_background_color>9ae4e8</profile_background_color>
    <profile_text_color>000000</profile_text_color>
    <profile_link_color>0000ff</profile_link_color>
    <profile_sidebar_fill_color>e0ff92</profile_sidebar_fill_color>
    <profile_sidebar_border_color>87bc44</profile_sidebar_border_color>
    <friends_count>0</friends_count>
    <created_at>Wed Jun 24 14:18:32 +0000 2009</created_at>
    <favourites_count>0</favourites_count>
    <utc_offset></utc_offset>
    <time_zone></time_zone>
    <profile_background_image_url>
http://static.twitter.com/images/themes/theme1/bg.gif</profile_background_image_url>
    <profile_background_tile>false</profile_background_tile>
    <statuses_count>1</statuses_count>
    <notifications></notifications>
    <verified>false</verified>
    <following></following>
  </user>
</status>

清单 13 显示了 DB2 UDF 的样例调用,它在 清单 12 生成的结果上将 JSON 转换为 JSONx。

清单 13. 清单 12 生成的 JSON 文档的 JSONx 表示
db2 => SELECT JSONXML.JSONTOXML('{"text":"Hello World!",
"in_reply_to_user_id":null,"user":{"following":null,
"favourites_count":0,"profile_sidebar_fill_color":"e0ff92",
"description":null,"verified":false,"utc_offset":null,
"statuses_count":1,"profile_sidebar_border_color":"87bc44",
"followers_count":0,"created_at":"Wed Jun 24 14:18:32 +0000 2009",
"url":null,"name":"pureXML TEST","friends_count":0,
"profile_text_color":"000000","protected":false,"profile_image_url":
"http:\/\/s3.amazonaws.com\/twitter_production
\/profile_images\/280225879\/twitterxml-1_bigger_normal.png",
"profile_background_image_url":"http:\/\/static.twitter.com
\/images\/themes\/theme1\/bg.gif",
"notifications":null,"time_zone":null,"profile_link_color":"0000ff",
"screen_name":"purexmltest","profile_background_tile":false,
"profile_background_color":"9ae4e8","location":null,"id":50316451},
"favorited":false,"created_at":"Wed Jun 24 15:04:13 +0000 2009",
"in_reply_to_screen_name":null,"truncated":false,"id":2311383114,
"in_reply_to_status_id":null,"source":"web"}') FROM SYSIBM.SYSDUMMY1

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
  <json:string name="text">Hello World!</json:string>
  <json:null name="in_reply_to_user_id"/>
  <json:object name="user">
    <json:null name="following"/>
    <json:number name="favourites_count">0</json:number>
    <json:string name="profile_sidebar_fill_color">e0ff92</json:string>
    <json:null name="description"/>
    <json:boolean name="verified">false</json:boolean>
    <json:null name="utc_offset"/>
    <json:number name="statuses_count">1</json:number>
    <json:string name="profile_sidebar_border_color">87bc44</json:string>
    <json:number name="followers_count">0</json:number>
    <json:string name="created_at">Wed Jun 24 14:18:32 +0000 2009</json:string>
    <json:null name="url"/>
    <json:string name="name">pureXML TEST</json:string>
    <json:number name="friends_count">0</json:number>
    <json:string name="profile_text_color">000000</json:string>
    <json:boolean name="protected">false</json:boolean>
    <json:string name="profile_image_url"
	>http://s3.amazonaws.com/twitter_production/profile_images
	/280225879/twitterxml-1_bigger_normal.png</json:string>
    <json:string name="profile_background_image_url"
	>http://static.twitter.com/images/themes/theme1/bg.gif</json:string>
    <json:null name="notifications"/>
    <json:null name="time_zone"/>
    <json:string name="profile_link_color">0000ff</json:string>
    <json:string name="screen_name">purexmltest</json:string>
    <json:boolean name="profile_background_tile">false</json:boolean>
    <json:string name="profile_background_color">9ae4e8</json:string>
    <json:null name="location"/>
    <json:number name="id">50316451</json:number>
  </json:object>
  <json:boolean name="favorited">false</json:boolean>
  <json:string name="created_at">Wed Jun 24 15:04:13 +0000 2009</json:string>
  <json:null name="in_reply_to_screen_name"/>
  <json:boolean name="truncated">false</json:boolean>
  <json:number name="id">2311383114</json:number>
  <json:null name="in_reply_to_status_id"/>
  <json:string name="source">web</json:string>
</json:object>

下载

描述名字大小
JSONx 包jsonx.zip145KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Information Management, Web development
ArticleID=450856
ArticleTitle=构建 pureXML 和 JSON 应用程序,第 1 部分: 使用 DB2 pureXML 储存和查询 JSON
publish-date=11302009