Parses a string while reading a JSON file.
string
is now returned unescaped.Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
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) |
||
character(kind=CK, len=:), | intent(out), | allocatable | :: | string |
the string (unescaped if necessary) |
subroutine parse_string(json, unit, str, string) implicit none class(json_core),intent(inout) :: json 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) character(kind=CK,len=:),allocatable,intent(out) :: string !! the string (unescaped !! if necessary) logical(LK) :: eof !! end of file flag logical(LK) :: escape !! for escape string parsing character(kind=CK,len=1) :: c !! character returned by [[pop_char]] integer(IK) :: ip !! index to put next character, !! to speed up by reducing the number !! of character string reallocations. character(kind=CK,len=:),allocatable :: error_message !! for string unescaping !at least return a blank string if there is a problem: string = blank_chunk if (.not. json%exception_thrown) then !initialize: escape = .false. ip = 1 do !get the next character from the file: call json%pop_char(unit, str=str, eof=eof, skip_ws=.false., popped=c) if (eof) then call json%throw_exception('Error in parse_string: Expecting end of string') return else if (c==quotation_mark .and. .not. escape) then !end of string exit else !if the string is not big enough, then add another chunk: if (ip>len(string)) string = string // blank_chunk !append to string: string(ip:ip) = c ip = ip + 1 ! check for escape character, so we don't ! exit prematurely if escaping a quotation ! character: if (escape) then escape = .false. else escape = (c==backslash) end if end if end do !trim the string if necessary: if (ip<len(string)+1) then if (ip==1) then string = CK_'' else string = string(1:ip-1) end if end if ! string is returned unescaped: ! (this will also validate any hex strings present) call unescape_string(string,error_message) if (allocated(error_message)) then call json%throw_exception(error_message) deallocate(error_message) !cleanup end if end if end subroutine parse_string