Generate a warning message if there was an error parsing a JSON file or string.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
integer(kind=IK), | intent(in) | :: | iunit | file unit number |
||
character(kind=CK,len=*), | intent(in) | :: | str | string with JSON data |
subroutine annotate_invalid_json(json,iunit,str)
implicit none
class(json_core),intent(inout) :: json
integer(IK),intent(in) :: iunit !! file unit number
character(kind=CK,len=*),intent(in) :: str !! string with JSON data
character(kind=CK,len=:),allocatable :: line !! line containing the error
character(kind=CK,len=:),allocatable :: arrow_str !! arrow string that points
!! to the current character
character(kind=CK,len=max_integer_str_len) :: line_str !! current line number string
character(kind=CK,len=max_integer_str_len) :: char_str !! current character count string
integer(IK) :: i !! line number counter
integer(IK) :: i_nl_prev !! index of previous newline character
integer(IK) :: i_nl !! index of current newline character
! If there was an error reading the file, then
! print the line where the error occurred:
if (json%exception_thrown) then
!the counters for the current line and the last character read:
call integer_to_string(json%line_count, int_fmt, line_str)
call integer_to_string(json%char_count, int_fmt, char_str)
!draw the arrow string that points to the current character:
arrow_str = repeat('-',max( 0_IK, json%char_count - 1_IK) )//'^'
if (json%line_count>0 .and. json%char_count>0) then
if (iunit/=0) then
if (use_unformatted_stream) then
call json%get_current_line_from_file_stream(iunit,line)
else
call json%get_current_line_from_file_sequential(iunit,line)
end if
else
!get the current line from the string:
! [this is done by counting the newline characters]
i_nl_prev = 0 !index of previous newline character
i_nl = 2 !just in case line_count = 0
do i=1,json%line_count
i_nl = index(str(i_nl_prev+1:),newline)
if (i_nl==0) then !last line - no newline character
i_nl = len(str)+1
exit
end if
i_nl = i_nl + i_nl_prev !index of current newline character
i_nl_prev = i_nl !update for next iteration
end do
line = str(i_nl_prev+1 : i_nl-1) !extract current line
end if
else
!in this case, it was an empty line or file
line = CK_''
end if
! add a newline for the error display if necessary:
line = trim(line)
if (len(line)>0) then
i = len(line)
if (line(i:i)/=newline) line = line//newline
else
line = line//newline
end if
!create the error message:
if (allocated(json%err_message)) then
json%err_message = json%err_message//newline
else
json%err_message = ''
end if
json%err_message = json%err_message//&
'line: '//trim(adjustl(line_str))//', '//&
'character: '//trim(adjustl(char_str))//newline//&
line//arrow_str
if (allocated(line)) deallocate(line)
end if
end subroutine annotate_invalid_json