Какой это формат данных (записи, разделенные двоеточием и точкой с запятой)?

Я интегрирую две плохо документированные системы, и в процессе я наткнулся на странный формат данных, которого раньше не видел. Он хранится в виде простого текста в БД без указания формата и того, как с ним работать.

a:17:{s:2:"id";s:27:"145219921F990B11C39E7220000";s:16:"purchase_country";s:2:"no";s:17:"purchase_currency";s:3:"nok";s:6:"locale";s:5:"nb-no";s:6:"status";s:17:"checkout_complete";s:9:"reference";s:27:"145212221F990B11C39E7221000";s:11:"reservation";s:10:"2348226550";s:10:"started_at";s:25:"2014-04-04T10:40:55+02:00";s:12:"completed_at";s:25:"2014-04-02T10:41:11+02:00";s:16:"last_modified_at";s:25:"2014-04-02T10:41:11+02:00";s:10:"expires_at";s:25:"2014-04-16T10:41:11+02:00";s:4:"cart";a:4:{s:25:"total_price_excluding_tax";i:489500;s:16:"total_tax_amount";i:0;s:25:"total_price_including_tax";i:489500;s:5:"items";a:2:{i:0;a:10:{s:9:"reference";s:2:"68";s:4:"name";s:21:"1.OSO SUPER S 200LIT.";s:8:"quantity";i:1;s:10:"unit_price";i:695000;s:8:"tax_rate";i:0;s:13:"discount_rate";i:0;s:4:"type";s:8:"physical";s:25:"total_price_including_tax";i:695500;s:25:"total_price_excluding_tax";i:694000;s:16:"total_tax_amount";i:0;}i:1;a:10:{s:9:"reference";s:2:"68";s:4:"name";s:32:"1.OSO SUPER S 200LIT. (discount)";s:8:"quantity";i:1;s:10:"unit_price";i:-205100;s:8:"tax_rate";i:0;s:13:"discount_rate";i:0;s:4:"type";s:8:"physical";s:25:"total_price_including_tax";i:-205100;s:25:"total_price_excluding_tax";i:-205100;s:16:"total_tax_amount";i:0;}}}s:8:"customer";a:1:{s:4:"type";s:6:"person";}s:16:"shipping_address";a:8:{s:10:"given_name";s:13:"Testperson-no";s:11:"family_name";s:8:"Approved";s:14:"street_address";s:18:"Sæffleberggate 56";s:11:"postal_code";s:4:"0563";s:4:"city";s:4:"OSLO";s:7:"country";s:2:"no";s:5:"email";s:32:"[email protected]";s:5:"phone";s:11:"40 12 34 56";}s:15:"billing_address";a:8:{s:10:"given_name";s:13:"Testperson-no";s:11:"family_name";s:8:"Approved";s:14:"street_address";s:18:"Sæffleberggate 56";s:11:"postal_code";s:4:"0563";s:4:"city";s:4:"OSLO";s:7:"country";s:2:"no";s:5:"email";s:32:"[email protected]";s:5:"phone";s:11:"40 12 34 56";}s:7:"options";a:1:{s:31:"allow_separate_shipping_address";b:0;}s:8:"merchant";a:5:{s:2:"id";s:4:"1601";s:9:"terms_uri";s:95:"omitted";s:12:"checkout_uri";s:59:"omitted";s:16:"confirmation_uri";s:220:"omitted";s:8:"push_uri";s:229:"omitted";}} 

Запись состоит из сегментов, разделенных двоеточиями:

  • Один тег типа char (массив, объект, целое число, десятичное число, логическое значение, строка)
  • Число, указывающее длину значения в символах, байтах, элементах (в случае массивов) или парах ключ-значение (в случае объектов), что кажется совершенно бесполезным, учитывая, что это текстовый формат, который требует от меня разбора отрезок длины в любом случае. Этого нет для целых и десятичных дробей.
  • Значение поля
  • Пары ключ-значение кажутся плоским списком из четного числа элементов. Они также, похоже, используют массивы в качестве объектов (см. пример).
  • Ограничитель ;, который, кажется, не нужен для объектов и массивов, просто чтобы сделать синтаксический анализ более утомительным.

Теперь разобрать эту вещь достаточно легко, но меня постоянно удивляют новые типы данных и их странный синтаксис, и я не уверен, что рассмотрел все крайние случаи с несколькими проанализированными образцами данных. Кто-нибудь знаком с этим форматом?


person migimunz    schedule 27.01.2015    source источник


Ответы (1)


Похоже на сериализацию PHP. См.: http://www.phpinternalsbook.com/classes_objects/serialization.html.

person Simon Moore    schedule 17.07.2015
comment
Вы совершенно правы. К счастью, он мне больше не нужен, и я написал для него синтаксический анализатор. Это, наверное, худший формат сериализации, который я когда-либо видел. - person migimunz; 18.07.2015