Создание приложения на базе pureXML и JSON: Часть 1. Хранение и извлечение JSON с помощью технологии pureXML в DB2

Простой способ преобразования JSON в XML

Популярная в Web 2.0 система текстовой записи JavaScript Object Notation (JSON) используется для представления объектов (или структур данных) в виде упорядоченного текста при обмене информацией между клиентом и сервером. Некоторые приложения выигрывают от использования объектов JSON для сохранения состояния между сеансами. Из этой статьи вы узнаете, как DB2® pureXML® может хранить, управлять и извлекать JSON с помощью простого отображения JSON на XML.

Нуну Жоб, Co-Op: специалист по технической реализации DB2, IBM

Фото Нуну ЖобаНуну Жоб (Nuno Job) – аспирант Университета Минью, прошедший стажировку в группе реализации pureXML Научно-исследовательского центра IBM им. Т. Дж. Уотсона. В круг его интересов входят технологии open-source, Linux, обеспечение безопасности и конфиденциальности, Web-технологии и иерархические базы данных. В настоящее время Нуну работает в отделении IBM в Торонто техническим специалистом по реализации DB2, помогая клиентам участвовать в партнерских программах IBM и поддерживать приложения IBM Ruby on Rails.



Сюзан Малайка, старший инженер, IBM

Сюзан Малайка (Susan Malaika) работает старшим инженером в отделе IBM Information Management Group (часть IBM Software Group). Специализируется на XML, Web и базах данных. Разработала стандарты, поддерживающие данные для сетевых сред на Global Grid Forum. Являясь разработчиком программных продуктов IBM, работает также в качестве интернет-специалиста, аналитика данных и разработчика приложений. Соавтор книги о Web и опубликованных статей по обработке транзакций и XML. Член IBM Academy of Technology.



Михаэл Шенкер, инженер по оптимизации программного обеспечения IBM DB2 для z/OS, IBM

Фото автора: Михаэл ШенкерМихаэл Шенкер (Michael Schenker) получил степень магистра вычислительной техники в Лейпцигском университете прикладных наук (Германия). Имеет семилетний стаж работы в IBM. За свою карьеру Михаэл работал над несколькими продуктами на основе баз данных, начав с работы стажером по DB2 Information Integration с акцентом на нереляционные оболочки. С конца 2003 года – штатный сотрудник IBM. В 2006 году вошел в штат отделения инструментов базы данных и работал над функциональными возможностями Web-сервисов DB2 в IBM Data Studio Developer. За это время приобрел богатый опыт в области SOA и Web-технологий. Недавно вошел в состав группы разработки оптимизатора DB2 для z/OS, но по-прежнему интересуется SOA и Web-технологиями, связанными с DB2.



23.11.2011

27 апреля 2010 г. – отредактирован и заменен файл загрузки jsonx.zip (см. раздел Загрузка) со следующими изменениями:

  • предотвращение исключения OutOfMemory в функции xml2json(), когда в документе встречаются многобайтовые символы;
  • предотвращение отсечения хвостовых символов функции xml2json() в результирующем CLOB, когда в документе встречаются многобайтовые символы;
  • поддержка необязательного файла свойств, определяющего выходной формат функции xml2json().

Введение

JavaScript (определяется в спецификации языка ECMAScript в ECMA) – это язык сценариев, впервые реализованный в Web-браузере Netscape Navigator для повышения эффективности обработки Web-страниц. JSON (определен в RFC 4627 IETF) – это формат, который позволяет записывать структуры данных JavaScript, такие как объекты и массивы, в виде упорядоченного текста.

Используемые сокращения

  • Ajax: Asynchronous JavaScript + XML
  • API: Application programming interface
  • DBMS: Database Management System
  • DOM: Document Object Model
  • HTTP: Hypertext Transfer Protocol
  • IETF: Internet Engineering Task Force
  • RFC: Request For Comments
  • RSS: Really Simple Syndication
  • SAX: Simple API for XML
  • SOA: Service Oriented Architecture
  • W3C: World Wide Web Consortium
  • XHTML: Extensible HyperText Markup Language
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations

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. Для этого мы введем XML-формат, называемый JSONx, опишем удобную для преобразования JSON-XML систему записи и объясним различия между JSONx и дружественными форматами.

По ходу статьи вы сможете с помощью прилагаемой загрузки построить JSON-хранилище с возможностями обработки запросов и индексации, основанное на примере базы данных pureXML DB2. Это первая часть цикла из трех статей, которые иллюстрируют, как на основе JSON можно построить трехуровневое приложение pureXML, содержащее JSON, Web-сервисы и гаджеты OpenSocial.

Рисунок 1. Обзор архитектуры Universal Services
Схема архитектуры Universal Services с возможностью взаимодействия с пользователем, JSON Universal Services и данными

Universal Services – это простой, но фиксированный набор операций с базами данных, который позволяет вызывать и редактировать XML-данные, хранящиеся в столбце pureXML базы данных DB2 (рисунок 1). Эти операции с базами данных позволяют вставлять, редактировать, удалять и запрашивать данные, доступные в виде Web-сервисов, через механизм Data Web Service. Подробнее о Universal Services для pureXML см. по ссылке в разделе Ресурсы. JSON Universal Services для pureXML выполняет те же операции с базой данных для клиентских систем, но в JSON, вместо XML, продолжая на стороне сервера работать с XML. Клиентское приложение "не знает", что в базе данных на стороне сервера входящие и исходящие сообщения JSON преобразуются в XML.

В статье также рассматриваются решения, которые позволяют представлять JSON как XML, а затем описываются некоторые сценарии и способ применения в таких сценариях pureXML из IBM DB2. К статье прилагается загрузка (так называемый комплект JSONx), которую можно использовать для создания примера базы данных pureXML JSONx. Она может составить основу JSONx-приложений. В загрузку включены две определяемые пользователем функции DB2, которые выполняют преобразование между JSON и JSONx.

JSON

JSON представляет собой читабельный текстовый формат, который используется для обмена данными между клиентами и серверами. Он предоставляет разработчикам формат обмена, который отображает непосредственно используемые ими структуры данных. Для этого JSON определяет следующие основные структуры данных: число, строка, булевы данные (истинно и ложно), массив (упорядоченная последовательность значений), объект (набор пар ключ-значение) и пустое значение.

Листинг 1 иллюстрирует объект JSON, описывающий клиента. Объект, вложенный в customerinfo, представляет собой пару объектов, которые определяют идентификатор (cid) и имя клиента. Объект customerinfo также содержит два структурированных объекта для определения адреса и номера телефона клиента.

Листинг 1. Информация о клиенте Kathy Smith в формате JSON
{
  "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 с Web-сервисом, который предоставляет API.

Такой API часто позволяет приложению выбрать формат обмена. В число широко поддерживаемых форматов входят XML, предопределенные XML-стандарты, такие как RSS и Atom, и JSON. Примеры таких форматов приведены в Приложении A.

Свобода выбора формата, используемого для обмена данными между приложением и Web-сервисом, позволяет ускорить процесс разработки. Однако это вызывает вопросы, связанные с обслуживанием инфраструктуры, которая поддерживает несколько форматов одновременно. Приведенный ниже список включает в себя некоторые из способов хранения данных.

  • Использование базы данных JSON, ориентированной на документы, такой как Apache CouchDB.
  • Использование реляционной базы данных путем разбиения и перекомпоновки JSON для каждого запроса.
  • Использование специального XML-хранилища (хранение JSONx) и предложение интерфейсов для предоставления и обработки JSON.

Рисунок 2 демонстрирует примеры по каждому из этих вариантов хранения данных. (см. увеличенную версию рисунка 2.)

Рисунок 2. Различные способы хранения JSON
Три способа хранения JSON: в базе данных JSON, в реляционной базе данных и как JSONx (XML-хранилище)

Все эти подходы имеют свои преимущества и недостатки. В этой статье не анализируются их особенности, но описываются сценарии, при которых использование pureXML представляет собой самый удобный подход для конкретного приложения. Вот некоторые из причин, по которым XML может оказаться наиболее удобным подходом:

  • остальная инфраструктура уже использует XML и SOA;
  • применение XML-устройств (таких как IBM Websphere® DataPower®) и XML-технологий, которые можно распространить на работу с JSONx.

Сравнение JSON с XML

Когда разработчики используют для обмена XML, они, как правило, ориентируются в XML посредством технологий XML DOM или SAX. Возможность работать с одной и той же структурой данных JSON при манипуляциях и при обмене данными упрощает процесс разработки, предоставляя декларативный доступ к объекту на основном языке программирования приложения.

Целью XML является предоставление самоописательной системы записи для обмена данными, которая может быть связана с жесткой схемой, и эта схема сама может быть предметом обмена. К тому же XML предоставляет множество функций, таких как пространства имен, сжатие, цифровые подписи и безопасность, наряду с декларативными языками, такими как XQuery и XSLT, которые можно вывести из C, Java™ и языков программирования Ruby для управления одним или несколькими XML-документами.

У JSON нет такого разнообразия функций, как у XML.

Представление JSON в XML

Основное внимание в этой статье уделяется тому, как создать XML-формат, изоморфный (структурно идентичный) любому документу JSON, другими словами, как создать универсальное отображение между любым документом JSON и любым документом XML.

Для достижения эффективного отображения между любыми документами JSON и XML нужно рассмотреть различия между двумя форматами. В настоящем разделе, чтобы проиллюстрировать эти различия, рассматривается, скорее, интуитивное, а не изоморфное отображение между XML и JSON. В таблице 1 описывается неполный пример такого отображения.

Таблица 1. Возможное отображение дружественного XML
ОбразецJSONXML Описание
1{"foo" : "bar"} <foo> bar </foo>Объект со значением типа строки
2{"foo" : true} <foo> <true/> </foo>Объект со значением типа "истинно"
3{"foo" : { "true" : null }} <foo> <true/> </foo>Объект с вложенным объектом со значением типа "пусто"
4{"foo bar!" : true} Error: "foo bar!" is not a valid QNameОбъект со значением типа "ложно" не преобразуется, поскольку ключ содержит недопустимые символы для QName XML (например, пробел и восклицательный знак)
5{"foo" : null} <foo/>Объект со значением типа "пусто"
6{"foo": { "bar" : null}}<foo> <bar/> </foo> Вложенные объекты с оконечным узлом типа "пусто"
7{"foo": { "bar" : [null, false]}} <foo> <bar> <null/> <false/></bar></foo> Объект с вложенным массивом

В качестве дружественного формата JSON мы применяем систему записи отображения с использованием, вместо канонических имен JSONx, специфических имен элементов и атрибутов данного приложения. У такого отображения много недостатков. Примеры 2 и 3 имеют различную структуру, тем не менее они преобразуются в один и тот же документ XML, что исключает возможность восстановления исходного документа JSON из сгенерированного XML. Ключ объекта в примере 4 содержит символы, недопустимые для QName XML. Есть способы преодоления этих ограничений, но в этом случае теряются преимущества изоморфной системы записи, такой как JSONx.


JSONx

Канонический JSON XML (JSONx) определяется как формат, изоморфный JSON. Поэтому проблемы дружественной системы записи, отмеченные в предыдущем разделе, в JSONx исключены.

В листинге 2 информация о клиенте Kathy Smith, записанная в листинге 1 с помощью JSON, приведена в виде JSONx.

Листинг 2. Информация о клиенте Kathy Smith в каноническом JSON XML (JSONx)
<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).

Листинг 3. Информация о клиенте Кэти Смит в максимально дружественном XML формате
<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

В этом разделе приводится краткий обзор комплекта JSONx (сценариев и кода) для DB2 pureXML, который демонстрирует, как:

  • преобразовать JSON в JSONx;
  • преобразовать JSONх в JSON;
  • импортировать документы JSON в JSONx;
  • сохранить JSONx;
  • индексировать JSONx для повышения производительности;
  • представить JSONx в реляционном формате;
  • преобразовать JSONx в дружественную XML систему записи;
  • соединить документы JSONx (можно с реляционными предикатами) с помощью XMLQuery.

За более подробным объяснением содержимого комплекта JSONx обращайтесь к файлу README, который входит в комплект.

Предварительные замечания

Для установки и запуска комплекта JSONx необходима DB2 v9.5 или более поздняя версия DB2. Можно загрузить DB2 Express-C, открытую редакцию DB2, содержащую pureXML, что делает ее полнофункциональным, реляционным сервером XML-данных (см. ссылку в разделе Ресурсы).

Хотя этот пакет может работать в других операционных системах, он тестировался с Ubuntu Jaunty Jackalope 9.04 и Microsoft® Windows® XP SP2.

Структура таблицы

В предыдущем разделе вы познакомились с информацией о клиенте Kathy Smith, представленной как в JSON, так и в JSONx. Ниже приведена таблица, в которой хранится информация о клиенте таблица 2.

Таблица 2. Таблица JSONXMLADMIN.CUSTOMER
Имя столбца Тип данных Описание
CID INTEGER Идентификатор клиента
INFOXML Запись с информацией о личности клиента
COMMENTVARCHAR(256)Короткий текстовый идентификатор клиента

В комплекте JSONx присутствуют еще две таблицы: Product и PurchaseOrder.

Таблица Product содержит информацию о продукте в столбце XML с именем DESCRIPTION, а также уникальный идентификатор данного продукта (таблица 3).

Таблица 3. Таблица JSONXMLADMIN.PRODUCT
Имя столбца Тип данных Описание
PID INTEGER Идентификатор продукта
DESCRIPTION XML Запись с информацией о продукте

PurchaseOrder описывает транзакцию, соответствующую приобретению клиентом одного или нескольких продуктов. Интересная особенность этой таблицы заключается в том, что идентификатор клиента содержится не в исходном файле JSON, а в отдельном реляционном столбце. При использовании JSONx и pureXML DB2 можно соединять данные из двух (или более) разных документов JSON, а также соединять реляционные записи с документами JSON. Конкретный пример выполнения такого соединения приведен в процедурном коде, содержащемся в комплекте JSONx (таблица 4).

Таблица 4. Таблица JSONXMLADMIN.PURCHASEORDER
Имя столбца Тип данных Описание
POID INTEGER Идентификатор заказа
CUSTID INTEGER Идентификатор клиента
PORDER XML Запись, содержащая информацию о заказе

Преобразование JSON в JSONx с помощью определяемых пользователем функций Java

Комплект JSONx зарегистрирует в DB2 две определяемых пользователем функции Java (UDF), которые позволяют преобразовывать JSON в JSONx и наоборот. Листинг 4 иллюстрирует очень простой вызов пользовательской функции для преобразования JSON в JSONx.

Листинг 4. Вызов определяемой пользователем функции Java JSONTOXML
SELECT JSONXML.JSONTOXML('{"foo": "bar"}') FROM SYSIBM.SYSDUMMY1

В листинге 5 показан результат работы оператора SELECT из листинга 4.

Листинг 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 приведен пример, в котором документ JSON, использовавшийся в листинге 4, преобразуется в JSONx, а затем обратно в JSON.

Листинг 6. Преобразование JSON в JSONx и обратно в JSON
SELECT JSONXML.XMLTOJSON(JSONXML.JSONTOXML('{"foo": "bar"}')) FROM SYSIBM.SYSDUMMY1

Соединение документов JSONx

Одна из интересных особенностей DB2 pureXML – разнообразие возможностей по объединению данных. Хранение JSONx в DB2 pureXML означает, что теперь данные JSON можно объединять точно так же, как документы XML. В листинге 7 показано, как использовать соединение как с реляционными, так и XML-предикатами и возвратом для каждого заказа, POID и имени клиента.

Листинг 7. Соединение JSONx с реляционным и XML-предикатами
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 иллюстрирует также некоторые из новейших дополнений, появившихся в pureXML DB2 v9.7. При создании представления документа JSONx с помощью XMLTABLE (листинг 8) 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()'
	)

Кроме того, JSONx можно получать из реляционных данных с использованием функций публикации SQL/XML.

Еще одна новая возможность – поддержка типа данных XML в пользовательских функциях, что позволяет манипулировать XML-документами. При использовании DB2 v9.7 для запуска комплекта JSONx можно воспользоваться двумя другими новыми возможностями: индексацией по представлению и пользовательской функцией XML.

UDF, входящая в комплект JSONx, использует XQuery Update Facility для преобразования JSONx в формат, адекватный представлению определенного подмножества JSON, который будет импортироваться по завершении выполнения примера базы данных JSONx. Хотя этот алгоритм преобразования не является общепринятым или эффективным, листинг 9 демонстрирует, как эффективно программировать сложные пользовательские функции XML с применением DB2 pureXML.

Листинг 9. Пример применения UDF XML для создания дружественного XML
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, выполните приведенные ниже инструкции.

  • Для использования комплекта JSONx на платформах Windows достаточно распаковать файл jsonx.zip, который можно найти в разделе ресурсов файловой системы. На платформах Linux® распакуйте файл jsonx.zip с помощью команды unzip -a -aa jsonx.zip. Это гарантирует использование правильных символов конца строки.
  • В системах Windows убедитесь, что инициализирован процессор командной строки DB2. На Linux-системах войдите в систему с именем пользователя, имеющего доступ к DB2 (db2inst1 – это пользователь DB2 по умолчанию).
  • Теперь можно запускать сценарии. (Примечание. Имейте в виду, что сценарии запуска могут настраивать некоторые параметры СУБД, а также останавливать и перезапускать СУБД, чтобы СУБД могла выполнять хранимые jar-процедуры. Если сценарии вызывают у вас подозрение, просмотрите их перед запуском!) На платформах Windows запустите start.bat. На Linux-платформе используйте start.sh. Когда сценарий закончит свою работу, вы должны увидеть в командной строке или оболочке bash нечто похожее на рисунок 3 (см. текстовую версию рисунка 3.)
Рисунок 3. Пример выходных данных комплекта JSONx
Пример выходных данных комплекта JSONx

Теперь все установлено, и можно посмотреть на результаты запроса в выходной папке. Чтобы убедиться, что результаты созданы правильно, можно сравнить выходные файлы в выходной папке с образцом, который находится в эталонной папке.

Если примеры не соответствуют образцам, обратитесь к файлу регистрации событий, расположенному в каталоге журналов, и посмотрите, что могло привести к ошибке.

В Приложении A иллюстрируются твиты из Twitter в формате дружественного XML и JSONx.


Заключение

В этой статье представлен новый формат (JSONx), который позволяет хранить JSON как XML в DB2 с помощью технологии pureXML. Описаны различия между JSONx и другими дружественными форматами. Рассмотрен типичный случай использования JSON и выделены преимущества использования pureXML для хранения JSON. Наконец, благодаря загрузке JSONx (комплект JSONx) у вас теперь есть фундамент для создания приложений JSON с поддержкой pureXML.

Следующие две статьи этого цикла посвящены представлению примера базы данных JSONx (созданного в комплекте JSONx) посредством JSON Universal Services и созданию уровня представления с помощью гаджетов Open-Social, которые опираются на JSON Universal Services как на сервер.

В будущем можно рассмотреть способы доступа Web-разработчиков к документам JSON (хранящимся в виде JSONx) с помощью JSONPath.


Приложение А

Как упоминалось в типичном сценарии JSON, многие Web-сервисы предоставляют несколько форматов для отображения информации. Примерами таких форматов служат отраслевые стандарты, такие как Atom и RSS, JSON или даже дружественные системы записи XML. Twitter предлагает API для доступа к твитам по идентификатору. В этом приложении содержатся результаты обработки двух запросов к Twitter с использованием curl, записанных с помощью JSON и дружественного XML. На этом примере мы покажем, как преобразовать дружественный XML в JSONx.

В листинге 11 мы используем curl для вызова информации об отдельном сообщении (твит с идентификатором 2311383114), которое мы разместили на twitter.com. Для получения информации о твите (его статуса) можно инициировать запрос curl с терминала, как в листинге 11, и будет возвращен статус этого твита в формате JSON. (Примечание. Вызов curl в листингах 11 и 12 разбит на две строки в целях форматирования.)

Листинг 11. Получение статуса твита с ID 2311383114 в формате JSON
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. Получение статуса твита с ID 2311383114 в дружественном XML-формате
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 приведен пример вызова функции UDF DB2, которая преобразует JSON в JSONx по результатам, полученным в листинге 12.

Листинг 13. JSONx-представление документа JSON, полученного в листинге 12.
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>

Загрузка

ОписаниеИмяРазмер
Набор инструментов JSONxjsonx.zip143 КБ

Ресурсы

Научиться

Получить продукты и технологии

  • DB2 Express-C: загрузите эту бесплатную общедоступную редакцию сервера данных DB2.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Information Management
ArticleID=776671
ArticleTitle=Создание приложения на базе pureXML и JSON: Часть 1. Хранение и извлечение JSON с помощью технологии pureXML в DB2
publish-date=11232011