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).
Note
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