Конвертер XML - JSON

Материал из Course Orchestra
Перейти к: навигация, поиск
Внимание! Вы просматриваете документацию к Celesta 6.x. Документация по Celesta 7.x доступна на courseorchestra.github.io/celesta.

1. Справочник Celesta

1.1 Введение и основные понятия
1.2 Запуск и авто-обновление
1.3 Базовая настройка
1.4 Системные таблицы
1.5 CelestaSQL
1.6 CelestaDoc
1.7 Контексты сессии и вызова
1.8 Курсоры
1.9 BLOB-поля
1.10 Option-поля
1.11 Защита от потерянных обновлений
1.12 Метаданные Celesta
1.13 CelestaUnit

2. Celesta и базы данных

2.1 Особенности работы Celesta с поддерживаемыми типами СУБД
2.2 Проектирование базы данных Celesta в DBSchema

3. Создание решений с использованием Celesta для ShowCase

3.1 Программа обучения Celesta
3.2 Подготовка рабочего места для работы с Celesta
3.2.1 Для разработчиков платформы
3.2.2 Для разработчиков решений
3.3 Системные гранулы Celesta
3.3.1 common
3.3.1.1 Экспорт/импорт данных
3.3.1.2 Навигатор
3.3.1.3 Серии номеров
3.3.1.4 Иерархия Дьюи
3.3.1.5 Системные функции
3.3.1.6 Реестр настроек
3.3.1.7 Mailsender
3.3.1.8 Common.filter
3.3.2 common.api
3.3.4 security
3.3.3 lyra
3.4 Стандартные гранулы Celesta
3.4.1 dirusing
3.4.2 workflow
3.4.3 File repository
3.5 Отрисовка элементов Showcase при помощи Celesta
3.5.1 Конвертер XML-JSON
3.5.2 Навигатор (Navigator)
3.5.3 Информационная панель (Datapanel)
3.5.4 Серверное действие (Server activity)
3.5.5 Вебтекст (WebText)
3.5.6 Грид (Grid)
3.5.6.1 Панель инструментов (ToolBar)
3.5.7 XForms
3.5.7.1 Селекторы
3.5.7.2 Submission
3.5.7.3 Загрузка/Выгрузка файлов (Upload/Download)

5. Решение проблем

5.1 Проблемы с кодировкой jython-файлов

Спецификация

XML и JSON — форматы, не допускающие полностью взаимно однозначного преобразования, поэтому для полного соответствия на формат данных в JSON конвертер накладывает некоторые ограничения.

Ниже представлены форматы иcходного JSON и полученного XML:

JSON

{"elem1":
    {"@attr0":None,
     "@attr1":True,
     "@attr2":"Text",
     "@attr3":u"Русский текст",
     "@attr4":1,
     "@attr5":3.14,
     "#text":u"Тоже текст",
     "#sorted":[{"elem2":5},
                {"elem3":u"Снова текст"},
                {"elem4":{
                    "@attr6":False
                    }
                }],
     "element5":[{"@attr7":1}, {"@attr8":2}],
     "element6":{"@attr9":u"Ещё текст"},
     "element7":None,
     "tag_empty_dic": {},
     "tag_empty_list": []
     }
}

XML

<elem1 attr1="True" attr0="" attr3="Русский текст" attr4="1" attr5="3.14" attr2="Text">
    Тоже текст
    <elem2>5</elem2>
    <elem3>Снова текст</elem3>
    <elem4 attr6="False"/>
    <element5 attr7="1"/>
    <element5 attr8="2"/>
    <element6 attr9="Ещё текст"/>
    <element7/>
    <tag_empty_dic></tag_empty_dic>
</elem1>

Конвертация происходит по следующим правилам:

  • Все ключи кроме #text,#sorted и начинающихся с @ переводятся в тэги, назовем такие ключи стандартными
  • Ключи начинающиеся с символа @ будут переведены в атрибуты (см. в примере @attr0,@attr1 и т.д.)
  • Значение ключа #text будет переведено в текст внутри элемента (см. в примере "elem1")
  • Если значение стандартного ключа представлено словарем, то все стандартные ключи этого словаря будут дочерними тэгами данного элемента, Ключи начинающиеся с символа @ будут его атрибутами .
  • Если значение стандартного ключа представлено списком, то будет создано столько элементов с именем ключа сколько элементов находится в данном списке (см "element5").
  • Ключ #sorted необходим для сохранения порядка следования тэгов (порядок тэгов важен например при описании action в Showcase). Ключ #sorted означает, что его значением должен быть список одноэлементных словарей со стандартными ключами. Тэги, полученные при помощи преобразования стандартных ключей, будут записаны в порядке их следования в исходном файле (см #sorted в "elem1").
  • Если в качестве значения стандартного ключа выступает простой тип (строка, число, булевый тип или объект None), то данный ключ будет преобразован в тэг а его значение в текст внутри тэга (см "elem2", "elem3" и т.д.).
  • Значение None любого ключа переводится в пустую строку (см "element7", @attr0).
  • В случае, когда у ключа в значении стоит пустой словарь (т.е. "tag_empty_dic": {}), то при преобразовании в xml создается открывающий и закрывающий тег с именем ключа (например, <tag_empty_dic></tag_empty_dic>)
  • В случае, когда у ключа в значении стоит пустой список (т.е. "tag_empty_list": []), то при преобразовании в xml не создается тега с именем ключа, т.е. данный ключ игнорируется.

Конвертер

Конвертер XML-JSON реализован на Java внутри Showcase в пакете ru.curs.celesta.showcase.utils. Пакет входит в файл showcaseutils.jar, поставляемый в дистрибутиве платформы.

Использовать ковертер можно следующим образом

  from ru.curs.celesta.showcase.utils import XMLJSONConverter


Данный класс содержит два базовых метода: xmlToJson и jsonToXml.


Преобразование XML в JSON:

  public static String xmlToJson(final String xml) throws SAXException, IOException


Все атрибуты тега переносятся в атрибуты json, имена которох начинаются с префикса @. В случа если встречен тег sorted, то все подобные теги становятся элементами json массива с именем #sorted с сохранением порядка следования в xml. Если тег содержащий атрибуты, содержит также значение, то оно переносится в json в атрибут с именем #text.

Параметр:

  • xml - XML строка.

Возвращаемое значение: строка в формате json.

Генерируемые исключения:

  • SAXException в случае возникновения SAX-ошибок (ошибок синтаксиса XML-файла).
  • IOException в случае ошибок ввода-вывода.


Преобразование JSON в XML:

  public static String jsonToXml(final String json) throws JSONException, TransformerException,
			ParserConfigurationException

Все атрибуты, имена которых начинаются с префикса @, переносятся в xml в виде соответствующего атрибута тега. В случае, если встречен атрибут с именем #sorted, то все дочерние элементы переносятся в xml с сохранением порядка элементов в json-массиве(#sorted). В случае, если встречен атрибут с именем #text, то его значение переносится как значение соответствующего (с именем родительского атрибута) тега.

Параметр:

  • json - JSON строка

Возвращаемое значение: xml строка.

Генерируемые исключения:

  • JSONException в случае ошибки парсинга json-объекта.
  • TransformerException в случае ошибки построениея DOM-модели документа, используемой в данном методе.
  • ParserConfigurationException в случае ошибки конфигурации JAVA.