Работоспособная версия парсера 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ОтобразитьСписокЗначений. Пример ее вызова можно найти в обработке для тестирования (см. вложенные файлы).
а есть ограничения на длину строки?
можно ли указать бооольшой масив, например, добавив его из текстового файла?
Во первых СПАСИБО!
И … Я прошу прощения… Но ИМХО в глобальном модуле название функции отличается…
Я правильно понимаю что
Функция глJSONПарсер(Знач Стр) Экспорт // в глобальном модуле
и
Отклик=глРазборJSON(фJSON); // в тестовой обработке
Это одно и то же?
И еще вопрос: функция вызывает сама себя?
Функция 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,Таб.Родитель+».»,»»)+Таб.Ключ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ЧислоВхождений;
КонецФункции // Токен
парсер не работает отправляю строку из 1млн символов и 1С вылетает на строке
Matches = RegExp.Execute(Стр);
(4)
https://msdn.microsoft.com/en-us/library/sx7b3k7y(v=VS.85).aspx
VBScript User’s Guide:
«23.01.14 17:38», — сколь же воды утекло с тех пор, всё проще делается.
«отправляю строку из 1млн символов», — так много зачем? 1 млн. символов
там даже немного больше 1млн символов (1,159млн)… так сайт на get запрос отвечает в формате json и этот ответ нужно парсить и далее результат анализировать.
(6)
роман в стихах «Евгений Онегин» 135 445 символов без пробелов
ваш «сайт на get запрос отвечает», — 8 556 романами
в пору задумываться над оптимизацией ответов сайта
высылайте свой пример (1,159млн),
попробую его в свой движок
может я что то не так понимаю и нужно разбор как то по другому делать, поясните буду признателен )
с JSON как то не приходилось сталкиваться, если есть идеи подкиньте в какую сторону копать. Формат вроде простой без заморочек но с ходу рабочего парсера не получилось найти… писать свой, перебором символов… мне кажется получится тормозная лажа, да и формат типовой как я понимаю 🙂
(4) (10)
мой движ по мотивам jsonviewer — тоже упал
однако, полноценный jsonviewer ваш файл прожевал успешно:
для экспериментов стелегой моего мне покуда хватает; возможно,.. позже погружусь глубже.
вывод:
ваша задача имеет решение.
(8)
так это ставки,.. теперь понятно, зачем такие огромные файлы.
да это биржа криптовалют… на 8.3 накидал типовой разбор там тоже все проходит…
(13)
славно.. в этой связи json для 7.7 ещё необходимо?
нет уже не нужно, спасибо.
на здоровье.