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 numbertype(json_core) :: json type(json_value),pointer :: p call json%parse(file='myfile.json', p=p)
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()
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
! 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)
! close the file if necessary
close(unit=iunit, iostat=istat)
! 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
else
call json%throw_exception('Error in json_parse_file: Error opening file: '//trim(file))
nullify(p)
end if
end subroutine json_parse_file