1C7.7 парсер JSON

РАБОТОСПОСОБНЫЙ парсер JSON встраивается в глобальный модуль в виде 3х функций. Для достижения положительного результата активно используется regexp.

Работоспособная версия парсера JSON. Вызов парсера осуществляется функцией

Результат =глJSONПарсер("{""firstName"":""Иван"",""lastName"":""Иванов"",""address"":{""streetAddress"":""Московское ш.,101,кв.101"",""city"":""Ленинград"",""postalCode"":101101},""phoneNumbers"":[""812 123-1234"",""916 123-4567""]}"); 

Разбор строки с JSON осуществляется рекурсивной функцией JSONТокен. Функция JSONТокенТабле вспомогательная, она необходима для разбора массива заключенного в квавдратные скобки, например :

"phoneNumbers":["812 123-1234","916 123-4567"]

Все использованные в настоящей работе шаблоны (patterns) regexp проверены с помощью online regexp tester.

Результатом работы является индексированнная таблица (см. 1С++ ИндексированнаяТаблица ) с полями KEY, PARENT и VALUE.

Для тестирования в глобальный модуль встроена функция глJSONОтобразитьСписокЗначений. Пример ее вызова можно найти в обработке для тестирования (см. вложенные файлы).

16 Comments

  1. selesta

    а есть ограничения на длину строки?

    можно ли указать бооольшой масив, например, добавив его из текстового файла?

    Reply
  2. ysobol

    Во первых СПАСИБО!

    И … Я прошу прощения… Но ИМХО в глобальном модуле название функции отличается…

    Я правильно понимаю что

    Функция глJSONПарсер(Знач Стр) Экспорт // в глобальном модуле

    и

    Отклик=глРазборJSON(фJSON); // в тестовой обработке

    Это одно и то же?

    Reply
  3. ysobol

    И еще вопрос: функция вызывает сама себя?

    Функция JSONТокен(Стр,Таб,Родитель = «»)

    Истина=-1;

    Ложь=0;

    RegExp = СоздатьОбъект(«VBScript.RegExp»);

    RegExp.IgnoreCase = Ложь; //Не игнорировать регистр

    RegExp.Global = Истина; //Поиск всех вхождений шаблона

    RegExp.MultiLine = Ложь; //Многострочный режим

    RegExp.Pattern = «(?:,|{)?([#k8SjZc9Dxk:]*):(«»[#k8SjZc9Dxk»»]*»»|{[#k8SjZc9Dxk}]*}|[[#k8SjZc9Dxk}]*]|[#k8SjZc9Dxk},]*)»;

    Matches = RegExp.Execute(Стр);

    ЧислоВхождений = Matches.Count();

    Если ЧислоВхождений > 0 Тогда

    Для к = 0 По ЧислоВхождений-1 Цикл

    Match = Matches.Item(к);

    Таб.НоваяСтрока();

    С = СокрЛП(Match.Value);

    Таб.Ключ = Сред(С, 2, Найти(С,»:»)-2);

    Таб.Значение = Сред(С,Найти(С,»:»)+1,СтрДлина(С));

    Таб.Родитель = Родитель;

    С=СокрЛП(Таб.Значение);

    Если ((лев(С, 1)=»{«) и (прав(С, 1)=»}»)) Тогда

    JSONТокен(С, Таб, ?(СтрДлина(Таб.Родитель)>0,Таб.Родитель+».»,»»)+Таб.Ключ);

    КонецЕсли;

    Если ((лев(С, 1)=»[«) и (прав(С, 1)=»]»)) Тогда

    JSONТокенТабле(С, Таб, ?(СтрДлина(Таб.Родитель)>0,Таб.Родитель+».»,»»)+Таб.Ключ);

    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    Возврат ЧислоВхождений;

    КонецФункции // Токен

    Reply
  4. ital

    парсер не работает отправляю строку из 1млн символов и 1С вылетает на строке

    Matches = RegExp.Execute(Стр);

    Reply
  5. Gkmy

    (4)

    VBScript User’s Guide: https://msdn.microsoft.com/en-us/library/sx7b3k7y(v=VS.85).aspx

    «23.01.14 17:38», — сколь же воды утекло с тех пор, всё проще делается.

    «отправляю строку из 1млн символов», — так много зачем? 1 млн. символов

    Reply
  6. ital

    там даже немного больше 1млн символов (1,159млн)… так сайт на get запрос отвечает в формате json и этот ответ нужно парсить и далее результат анализировать.

    Reply
  7. Gkmy

    (6)

    роман в стихах «Евгений Онегин» 135 445 символов без пробелов

    ваш «сайт на get запрос отвечает», — 8 556 романами

    в пору задумываться над оптимизацией ответов сайта

    высылайте свой пример (1,159млн),

    попробую его в свой движок

    Reply
  8. ital
  9. ital

    может я что то не так понимаю и нужно разбор как то по другому делать, поясните буду признателен )

    Reply
  10. ital

    с JSON как то не приходилось сталкиваться, если есть идеи подкиньте в какую сторону копать. Формат вроде простой без заморочек но с ходу рабочего парсера не получилось найти… писать свой, перебором символов… мне кажется получится тормозная лажа, да и формат типовой как я понимаю 🙂

    Reply
  11. Gkmy

    (4) (10)

    мой движ по мотивам jsonviewer — тоже упал

    однако, полноценный jsonviewer ваш файл прожевал успешно:

    для экспериментов с телегой моего мне покуда хватает; возможно,.. позже погружусь глубже.

    вывод:

    ваша задача имеет решение.

    Reply
  12. Gkmy

    (8)

    так это ставки,.. теперь понятно, зачем такие огромные файлы.

    Reply
  13. ital

    да это биржа криптовалют… на 8.3 накидал типовой разбор там тоже все проходит…

    Reply
  14. Gkmy

    (13)

    славно.. в этой связи json для 7.7 ещё необходимо?

    Reply
  15. ital

    нет уже не нужно, спасибо.

    Reply
  16. Gkmy

    на здоровье.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *