Skip to content

Commit 88bfdc3

Browse files
authored
Merge pull request #4 from Stepa86/feature/RemoveComments
Вырезание комментариев в тексте перед чтением JSON
2 parents 4b4a421 + 62b8a6e commit 88bfdc3

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

src/json.os

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,22 +344,40 @@
344344
СхемаПодстановок,
345345
(АвтоматическиПриводитьКСтруктуре = Истина));
346346

347+
ЗначениеБезКомментариев = ВырезатьКомментарии( Значение );
348+
347349
// Стартовые значения.
348-
Индекс = 1; Длина = СтрДлина(Значение);
350+
Индекс = 1; Длина = СтрДлина(ЗначениеБезКомментариев);
349351

350352
// Форматирование (первый шаг парсера).
351353
Если Стандарт Тогда СимволыФорматирования = " " + Символы.ВК + Символы.ПС + Символы.Таб;
352-
jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования);
354+
jsonПрочитатьПропуститьФорматирование(ЗначениеБезКомментариев, Стандарт, Индекс, Длина, СимволыФорматирования);
353355
КонецЕсли;
354356
Если (Индекс > Длина) Тогда
355357
ВызватьИсключение ИсключениеПустойПакетДанных();
356358
КонецЕсли;
357359

358360
// Парсер.
359-
Возврат jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, Истина);
361+
Возврат jsonПрочитать(ЗначениеБезКомментариев, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, Истина);
360362

361363
КонецФункции // jsonПрочитатьИнициализация()
362364

365+
// Удаляет все комментарии // и блоки /* */
366+
Функция ВырезатьКомментарии( Знач пТекст )
367+
368+
регулярноеВыражение = Новый РегулярноеВыражение( "(@(?:""[^""]*"")+|""(?:[^""\n\\]+|\\.)*""|'(?:[^'\n\\]+|\\.)*')|//.*|/\*(?s:.*?)\*/" );
369+
370+
ЗначениеБезКомментариев = регулярноеВыражение.Заменить(пТекст, "$1" );
371+
372+
// После удаления комментария могли остаться пустые строки
373+
Пока СтрНайти( ЗначениеБезКомментариев, Символы.LF + Символы.LF ) > 0 Цикл
374+
ЗначениеБезКомментариев = СтрЗаменить( ЗначениеБезКомментариев, Символы.LF + Символы.LF, Символы.LF )
375+
КонецЦикла;
376+
377+
Возврат ЗначениеБезКомментариев;
378+
379+
КонецФункции
380+
363381
Функция jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, ПервыйУровень)
364382

365383
Символ = Сред(Значение, Индекс, 1);

tests/json-test.os

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПримитивныеЗначенияКлючейПреобразуютсяКСтроке");
4242
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПримитивныеЗначенияКлючейВызываютИсключение");
4343

44+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИгнорированиеКомментария");
45+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИгнорированиеБлочногоКомментария");
46+
ВсеТесты.Добавить("ТестДолжен_ПроверитьНаличиеКомментарияВКавычках");
47+
4448
Возврат ВсеТесты;
4549
КонецФункции
4650

@@ -232,6 +236,57 @@
232236

233237
КонецПроцедуры
234238

239+
Процедура ТестДолжен_ПроверитьИгнорированиеКомментария() Экспорт
240+
241+
тестовыйJSON = "{
242+
|// Комментарий
243+
|// Комментарий 2
244+
| ""ИмяПеременной"": ""Значение переменной"" // Это комментарий к строке
245+
|}";
246+
247+
Объект = _преобразовательJSON.ПрочитатьJSON(тестовыйJSON,,,Истина);
248+
Утверждения.ПроверитьРавенство(ТипЗнч(Объект), Тип("Структура"));
249+
Утверждения.ПроверитьРавенство(Объект.Количество(), 1);
250+
Утверждения.ПроверитьРавенство(Объект.ИмяПеременной, "Значение переменной");
251+
252+
КонецПроцедуры
253+
254+
Процедура ТестДолжен_ПроверитьИгнорированиеБлочногоКомментария() Экспорт
255+
256+
тестовыйJSON = "{
257+
|/* Комментарий */
258+
| ""ИмяПеременной"": /* Комментарий в неожиданном месте*/ ""Значение переменной""
259+
|/*******************************************
260+
|Любимый с детства многострочный комментарий
261+
|********************************************/
262+
|}";
263+
264+
Объект = _преобразовательJSON.ПрочитатьJSON(тестовыйJSON,,,Истина);
265+
Утверждения.ПроверитьРавенство(ТипЗнч(Объект), Тип("Структура"));
266+
Утверждения.ПроверитьРавенство(Объект.Количество(), 1);
267+
Утверждения.ПроверитьРавенство(Объект.ИмяПеременной, "Значение переменной");
268+
269+
КонецПроцедуры
270+
271+
Процедура ТестДолжен_ПроверитьНаличиеКомментарияВКавычках() Экспорт
272+
273+
тестовыйJSON = "{
274+
|""КомментарийВСтроке"": ""//Значение переменной"",
275+
|""БлочныйКомментарийВСтроке"": ""/*Значение переменной*/"",
276+
|""КомментарийВСтроке2"": '//Значение переменной',
277+
|""БлочныйКомментарийВСтроке2"": '/*Значение переменной*/'
278+
|}";
279+
280+
Объект = _преобразовательJSON.ПрочитатьJSON(тестовыйJSON,,,Истина);
281+
Утверждения.ПроверитьРавенство(ТипЗнч(Объект), Тип("Структура"));
282+
Утверждения.ПроверитьРавенство(Объект.Количество(), 4);
283+
Утверждения.ПроверитьРавенство(Объект.КомментарийВСтроке, "//Значение переменной");
284+
Утверждения.ПроверитьРавенство(Объект.БлочныйКомментарийВСтроке, "/*Значение переменной*/");
285+
Утверждения.ПроверитьРавенство(Объект.КомментарийВСтроке2, "//Значение переменной");
286+
Утверждения.ПроверитьРавенство(Объект.БлочныйКомментарийВСтроке2, "/*Значение переменной*/");
287+
288+
КонецПроцедуры
289+
235290
Функция НедопустимыйТипЗначенияКлючаВызываетИсключение(ЗначениеКлюча)
236291
Объект = Новый Соответствие;
237292
Объект.Вставить(ЗначениеКлюча, "Значение");

0 commit comments

Comments
 (0)