Пока остановился на таком варианте: колбэк только для обработки массивов, вызывается после добавления записи очереди в json-массив или наоборот, добавления элемента json-массива в очередь. То есть и в json::CreateArray, и в cJSON.ToQueue.
Скачать на нашем ftp: /cjson/1.37.1/
Попутно, есть возможность прервать обработку массива по каким-то причинам, вернув FALSE (см. пример ниже).
Также есть вероятность, что колбэк будет вызван для разных массивов (для случаев очередей в очередях), поэтому передаётся ссылка на обрабатываемый json массив, его можно сравнить с корневым объектом (см. пример ниже).
Параметр pRules передаётся просто так, чтобы как-то оправдать имя класса TCJsonRuleHelper, в котором этот колбэк объявлен.
Декларация:
Код: Выделить всё
rh CLASS(TCJsonRuleHelper)
ArrayItemCB PROCEDURE(LONG pArraySize, LONG pCurrentIndex, CONST *cJSON pArray, *typCJsonFieldRules pRules), BOOL, VIRTUAL
END
Реализация:
Код: Выделить всё
rh.ArrayItemCB PROCEDURE(LONG pArraySize, LONG pCurrentIndex, CONST *cJSON pArray, *typCJsonFieldRules pRules)
newPercent LONG, AUTO
CODE
IF pArray &= Root
newPercent = (pCurrentIndex * 100 / pArraySize)
IF newPercent > curPercent
curPercent = newPercent
xProgress{Prop:Progress} = curPercent
! printd('rh.ArrayItemCB(%i, %i): progress %i%%', pArraySize, pCurrentIndex, curPercent)
END
! !- 100 records limit
! IF pCurrentIndex = 100
! RETURN FALSE
! END
END
RETURN TRUE