Parse the JSON file and populate the json_value tree.
The inputs can be:
file
& unit
: the specified unit is used to read JSON from file.
[note if unit is already open, then the filename is ignored]file
: JSON is read from file using internal unit number type(json_core) :: json
type(json_value),pointer :: p
call json%load(file='myfile.json', p=p)
Note
When calling this routine, any exceptions thrown from previous calls will automatically be cleared.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
character(kind=CDK, len=*), | intent(in) | :: | file |
JSON file name |
||
type(json_value), | pointer | :: | p |
output structure |
||
integer(kind=IK), | intent(in), | optional | :: | unit |
file unit number (/= 0) |
subroutine json_parse_file(json, file, p, unit) implicit none class(json_core),intent(inout) :: json character(kind=CDK,len=*),intent(in) :: file !! JSON file name type(json_value),pointer :: p !! output structure integer(IK),intent(in),optional :: unit !! file unit number (/= 0) integer(IK) :: iunit !! file unit actually used integer(IK) :: istat !! iostat flag logical(LK) :: is_open !! if the file is already open logical(LK) :: has_duplicate !! if checking for duplicate keys character(kind=CK,len=:),allocatable :: path !! path to any duplicate key ! clear any exceptions and initialize: call json%initialize() call json%prepare_parser() if ( present(unit) ) then if (unit==0) then call json%throw_exception('Error in json_parse_file: unit number must not be 0.') return end if iunit = unit ! check to see if the file is already open ! if it is, then use it, otherwise open the file with the name given. inquire(unit=iunit, opened=is_open, iostat=istat) if (istat==0 .and. .not. is_open) then ! open the file open ( unit = iunit, & file = file, & status = 'OLD', & action = 'READ', & form = form_spec, & access = access_spec, & iostat = istat & FILE_ENCODING ) else ! if the file is already open, then we need to make sure ! that it is open with the correct form/access/etc... end if else ! open the file with a new unit number: open ( newunit = iunit, & file = file, & status = 'OLD', & action = 'READ', & form = form_spec, & access = access_spec, & iostat = istat & FILE_ENCODING ) end if if (istat==0) then if (use_unformatted_stream) then ! save the file size to be read: inquire(unit=iunit, size=json%filesize, iostat=istat) end if ! create the value and associate the pointer call json_value_create(p) ! Note: the name of the root json_value doesn't really matter, ! but we'll allocate something here just in case. p%name = trim(file) !use the file name ! parse as a value call json%parse_value(unit=iunit, str=CK_'', value=p) call json%parse_end(unit=iunit, str=CK_'') ! check for errors: if (json%exception_thrown) then call json%annotate_invalid_json(iunit,CK_'') else if (.not. json%allow_duplicate_keys) then call json%check_for_duplicate_keys(p,has_duplicate,path=path) if (.not. json%exception_thrown) then if (has_duplicate) then call json%throw_exception('Error in json_parse_file: '//& 'Duplicate key found: '//path) end if end if end if end if ! close the file: close(unit=iunit, iostat=istat) else call json%throw_exception('Error in json_parse_file: Error opening file: '//trim(file)) nullify(p) end if end subroutine json_parse_file