Returns a child in the object or array given the name string.
The name search can be case-sensitive or not, and can have significant trailing whitespace or not, depending on the settings in the json_core class.
The name
input is not a path, and is not parsed like it is in json_get_by_path.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
type(json_value), | intent(in), | pointer | :: | p | ||
character(kind=CK,len=*), | intent(in) | :: | name | the name of a child of |
||
type(json_value), | pointer | :: | child | pointer to the child |
||
logical(kind=LK), | intent(out), | optional | :: | found | true if the value was found (if not present, an exception will be thrown if it was not found. If present and not found, no exception will be thrown). |
subroutine json_value_get_child_by_name(json, p, name, child, found)
implicit none
class(json_core),intent(inout) :: json
type(json_value),pointer,intent(in) :: p
character(kind=CK,len=*),intent(in) :: name !! the name of a child of `p`
type(json_value),pointer :: child !! pointer to the child
logical(LK),intent(out),optional :: found !! true if the value was found
!! (if not present, an exception
!! will be thrown if it was not
!! found. If present and not
!! found, no exception will be
!! thrown).
integer(IK) :: i,n_children
logical :: error
nullify(child)
if (.not. json%exception_thrown) then
if (associated(p)) then
error = .true. ! will be false if it is found
if (p%var_type==json_object) then
n_children = json%count(p)
child => p%children !start with first one
do i=1, n_children
if (.not. associated(child)) then
call json%throw_exception(&
'Error in json_value_get_child_by_name: '//&
'Malformed JSON linked list')
exit
end if
if (allocated(child%name)) then
!name string matching routine:
if (json%name_equal(child,name)) then
error = .false.
exit
end if
end if
child => child%next
end do
end if
if (error) then
!did not find anything:
call json%throw_exception(&
'Error in json_value_get_child_by_name: '//&
'child variable '//trim(name)//' was not found.')
nullify(child)
end if
else
call json%throw_exception(&
'Error in json_value_get_child_by_name: '//&
'pointer is not associated.')
end if
! found output:
if (json%exception_thrown) then
if (present(found)) then
call json%clear_exceptions()
found = .false.
end if
else
if (present(found)) found = .true.
end if
else
if (present(found)) found = .false.
end if
end subroutine json_value_get_child_by_name