diff --git a/packages/fcl-json/src/jsonscanner.pp b/packages/fcl-json/src/jsonscanner.pp index 700f5d0453..45ef299ac2 100644 --- a/packages/fcl-json/src/jsonscanner.pp +++ b/packages/fcl-json/src/jsonscanner.pp @@ -373,8 +373,9 @@ begin end else if u1<>0 then MaybeAppendUnicode; - if FTokenStr^ = #0 then - Error(SErrOpenString,[FCurRow]); + if FTokenStr^ < #$20 then + if FTokenStr^ = #0 then Error(SErrOpenString,[FCurRow]) + else if joStrict in Options then Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]); Inc(FTokenStr); end; if FTokenStr^ = #0 then @@ -530,23 +531,33 @@ begin tstart:=CurRow; Tcol:=CurColumn; TokenStart := FTokenStr; + Result:=tkIdentifier; + case TokenStart^ of + 't': if (TokenStart[1] = 'r') and (TokenStart[2] = 'u') and (TokenStart[3] = 'e') then + Result:=tkTrue; + 'f': if (TokenStart[1] = 'a') and (TokenStart[2] = 'l') and (TokenStart[3] = 's') and (TokenStart[4] = 'e') then + Result:=tkFalse; + 'n': if (TokenStart[1] = 'u') and (TokenStart[2] = 'l') and (TokenStart[3] = 'l') then + Result:=tkNull; + end; + if result <> tkIdentifier then inc(FTokenStr, length(TokenInfos[result]) - 1); repeat Inc(FTokenStr); until not (FTokenStr^ in ['A'..'Z', 'a'..'z', '0'..'9', '_']); SectionLength := FTokenStr - TokenStart; FCurTokenString:=''; SetString(FCurTokenString, TokenStart, SectionLength); - for it := tkTrue to tkNull do - if CompareText(CurTokenString, TokenInfos[it]) = 0 then - begin - Result := it; - FCurToken := Result; - exit; - end; - if (joStrict in Options) then - Error(SErrInvalidCharacter, [tStart,tcol,TokenStart[0]]) - else - Result:=tkIdentifier; + if (result = tkIdentifier) or (SectionLength <> length(TokenInfos[result])) then begin + if (joStrict in Options) then + Error(SErrInvalidCharacter, [tStart,tcol,TokenStart[0]]); + for it := tkTrue to tkNull do + if CompareText(CurTokenString, TokenInfos[it]) = 0 then + begin + Result := it; + FCurToken := Result; + exit; + end; + end; end; else Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);