Checks a JSON structure for duplicate child names. This one recursively traverses the entire structure (calling json_check_children_for_duplicate_keys recursively for each element).
This will only check for one duplicate, it will return the first one that it finds.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
type(json_value), | intent(in), | pointer | :: | p | the object to search. If |
|
logical(kind=LK), | intent(out) | :: | has_duplicate | true if there is at least
one duplicate |
||
character(kind=CK,len=:), | intent(out), | optional | allocatable | :: | name | the duplicate name (unallocated if no duplicates were found) |
character(kind=CK,len=:), | intent(out), | optional | allocatable | :: | path | the full path to the duplicate name (unallocated if no duplicate was found) |
subroutine json_check_all_for_duplicate_keys(json,p,has_duplicate,name,path)
implicit none
class(json_core),intent(inout) :: json
type(json_value),pointer,intent(in) :: p !! the object to search. If `p` is
!! not a `json_object`, then `has_duplicate`
!! will be false.
logical(LK),intent(out) :: has_duplicate !! true if there is at least
!! one duplicate `name` key anywhere
!! in the structure.
character(kind=CK,len=:),allocatable,intent(out),optional :: name !! the duplicate name
!! (unallocated if no
!! duplicates were found)
character(kind=CK,len=:),allocatable,intent(out),optional :: path !! the full path to the
!! duplicate name
!! (unallocated if no
!! duplicate was found)
has_duplicate = .false.
if (.not. json%exception_thrown) then
call json%traverse(p,duplicate_key_func)
end if
contains
subroutine duplicate_key_func(json,p,finished)
!! Callback function to check each element
!! for duplicate child names.
implicit none
class(json_core),intent(inout) :: json
type(json_value),pointer,intent(in) :: p
logical(LK),intent(out) :: finished
#if defined __GFORTRAN__
! this is a workaround for a gfortran bug (6 and 7),
character(kind=CK,len=:),allocatable :: tmp_name !! temp variable for `name` string
character(kind=CK,len=:),allocatable :: tmp_path !! temp variable for `path` string
if (present(name) .and. present(path)) then
call json%check_children_for_duplicate_keys(p,has_duplicate,name=tmp_name,path=tmp_path)
else if (present(name) .and. .not. present(path)) then
call json%check_children_for_duplicate_keys(p,has_duplicate,name=tmp_name)
else if (.not. present(name) .and. present(path)) then
call json%check_children_for_duplicate_keys(p,has_duplicate,path=tmp_path)
else
call json%check_children_for_duplicate_keys(p,has_duplicate)
end if
if (has_duplicate) then
if (present(name)) name = tmp_name
if (present(path)) path = tmp_path
end if
#else
call json%check_children_for_duplicate_keys(p,has_duplicate,name,path)
#endif
finished = has_duplicate .or. json%exception_thrown
end subroutine duplicate_key_func
end subroutine json_check_all_for_duplicate_keys