Traverse a JSON structure. This routine calls the user-specified json_traverse_callback_func for each element of the structure.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
type(json_value), | intent(in), | pointer | :: | p | ||
procedure(json_traverse_callback_func) | :: | traverse_callback |
subroutine json_traverse(json,p,traverse_callback)
implicit none
class(json_core),intent(inout) :: json
type(json_value),pointer,intent(in) :: p
procedure(json_traverse_callback_func) :: traverse_callback
logical(LK) :: finished !! can be used to stop the process
if (.not. json%exception_thrown) call traverse(p)
contains
recursive subroutine traverse(p)
!! recursive [[json_value]] traversal.
implicit none
type(json_value),pointer,intent(in) :: p
type(json_value),pointer :: element !! a child element
integer(IK) :: i !! counter
integer(IK) :: icount !! number of children
if (json%exception_thrown) return
call traverse_callback(json,p,finished) ! first call for this object
if (finished) return
!for arrays and objects, have to also call for all children:
if (p%var_type==json_array .or. p%var_type==json_object) then
icount = json%count(p) ! number of children
if (icount>0) then
element => p%children ! first one
do i = 1, icount ! call for each child
if (.not. associated(element)) then
call json%throw_exception('Error in json_traverse: '//&
'Malformed JSON linked list')
return
end if
call traverse(element)
if (finished .or. json%exception_thrown) exit
element => element%next
end do
end if
nullify(element)
end if
end subroutine traverse
end subroutine json_traverse