Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=IK), | intent(in) | :: | unit | file unit number (if parsing from a file) |
||
character(kind=CK,len=*), | intent(in) | :: | str | JSON string (if parsing from a string) |
||
type(json_value), | intent(inout), | pointer | :: | parent | the parsed object will be added as a child of this |
Core parsing routine.
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
type(json_value), | public, | pointer | :: | pair | |||
logical(kind=LK), | public | :: | eof | ||||
character(kind=CK,len=1), | public | :: | c | ||||
character(kind=CK,len=:), | public, | allocatable | :: | tmp | this is a work-around for a bug in the gfortran 4.9 compiler. |
recursive subroutine parse_object(unit, str, parent)
implicit none
integer(IK),intent(in) :: unit !! file unit number (if parsing from a file)
character(kind=CK,len=*),intent(in) :: str !! JSON string (if parsing from a string)
type(json_value),pointer :: parent !! the parsed object will be added as a child of this
type(json_value),pointer :: pair
logical(LK) :: eof
character(kind=CK,len=1) :: c
character(kind=CK,len=:),allocatable :: tmp !! this is a work-around for a bug
!! in the gfortran 4.9 compiler.
if (.not. exception_thrown) then
!the routine is being called incorrectly.
if (.not. associated(parent)) then
call throw_exception('Error in parse_object: parent pointer not associated.')
end if
nullify(pair) !probably not necessary
! pair name
c = pop_char(unit, str=str, eof = eof, skip_ws = .true.)
if (eof) then
call throw_exception('Error in parse_object:'//&
' Unexpected end of file while parsing start of object.')
return
else if (end_object == c) then
! end of an empty object
return
else if (quotation_mark == c) then
call json_value_create(pair)
call parse_string(unit, str, tmp) !write to a tmp variable because of
pair % name = tmp ! a bug in 4.9 gfortran compiler.
deallocate(tmp)
if (exception_thrown) then
call json_destroy(pair)
return
end if
else
call throw_exception('Error in parse_object: Expecting string: "'//c//'"')
return
end if
! pair value
c = pop_char(unit, str=str, eof = eof, skip_ws = .true.)
if (eof) then
call throw_exception('Error in parse_object:'//&
' Unexpected end of file while parsing object member.')
return
else if (colon_char == c) then
! parse the value
call parse_value(unit, str, pair)
if (exception_thrown) then
call json_destroy(pair)
return
else
call json_add(parent, pair)
end if
else
call throw_exception('Error in parse_object:'//&
' Expecting : and then a value: '//c)
return
end if
! another possible pair
c = pop_char(unit, str=str, eof = eof, skip_ws = .true.)
if (eof) then
call throw_exception('Error in parse_object: '//&
'End of file encountered when parsing an object')
return
else if (delimiter == c) then
! read the next member
call parse_object(unit = unit, str=str, parent = parent)
else if (end_object == c) then
! end of object
return
else
call throw_exception('Error in parse_object: Expecting end of object: '//c)
return
end if
end if
end subroutine parse_object