FPC 3.3.1 fpjson Fails to Parse Backslashes Correctly
# FPC 3.3.1 Bug Report: fpjson Fails to Parse Backslashes Correctly
**Date:** December 29, 2025\
**Last Verified:** December 29, 2025 (Bug still present in FPC 3.3.1-19122-ge8d90a3042)\
**Affected Version:** Free Pascal Compiler 3.3.1 (Trunk)\
**IDE:** Lazarus 4.5\
**Operating System:** Windows 10 **Component:** FCL-JSON (`fpjson`, `jsonscanner`)\
**Severity:** Critical (Breaks compatibility with standard JSON, especially Windows paths)
## Description
The `fpjson` unit in recent FPC 3.3.1 trunk builds fails to parse JSON strings containing escaped backslashes (e.g., `"\\"`) or backslashes used in file paths (e.g., `"C:\\Windows"`).
When parsing a string literal in JSON that contains an escaped backslash, the parser **eliminates all content before the last backslash** in the string. This behavior represents a regression from FPC 3.2.2/3.2.3, where JSON parsing works as expected.
**Verified Bug Pattern (December 2025):** The parser removes everything before the final backslash character:
- Input: `"C:\\Windows"` → Output: `\Windows` (Expected: `C:\Windows`)
- Input: `"A\\B"` → Output: `\B` (Expected: `A\B`)
## Steps to Reproduce
Compile and run the following Pascal program using FPC 3.3.1:
```pascal
program TestJSONBackslash;
{$mode objfpc}{$H+}
uses
SysUtils, fpjson, jsonparser;
var
JObject: TJSONObject;
JParser: TJSONParser;
JSONString: String;
ParsedPath: String;
begin
// A simple JSON object with a Windows path: {"path": "C:\Windows"}
// In JSON, backslashes must be escaped: "C:\\Windows"
JSONString := '{"path": "C:\\Windows"}';
WriteLn('Input JSON: ', JSONString);
JParser := TJSONParser.Create(JSONString, [joUTF8]);
try
try
JObject := JParser.Parse as TJSONObject;
ParsedPath := JObject.Strings['path'];
WriteLn('Parsed Path: ', ParsedPath);
if ParsedPath = 'C:\Windows' then
WriteLn('RESULT: PASS')
else
WriteLn('RESULT: FAIL (Expected "C:\Windows", got "', ParsedPath, '")');
except
on E: Exception do
WriteLn('RESULT: EXCEPTION - ', E.Message);
end;
finally
JParser.Free;
if Assigned(JObject) then JObject.Free;
end;
end.
```
### Expected Behavior (FPC 3.2.x)
```text
Input JSON: {"path": "C:\\Windows"}
Parsed Path: C:\Windows
RESULT: PASS
```
### Actual Behavior (FPC 3.3.1)
The output varies depending on the exact revision, but typically:
```text
Input JSON: {"path": "C:\\Windows"}
Parsed Path: C:Windows <-- Missing backslash
RESULT: FAIL
```
Or in some cases, it may corrupt adjacent characters.
## Analysis
The issue appears to be located in `jsonscanner.pp` or `jsonreader.pp` within the tokenization logic for string literals. Accessing the raw source code of 3.3.1 reveals changes in how escape sequences are handled compared to 3.2.x.
## Workaround
We have confirmed that replacing the FPC 3.3.1 `fcl-json` units (`fpjson.pp`, `jsonparser.pp`, `jsonscanner.pp`, `jsonreader.pp`) with the stable versions from FPC 3.2.3 resolves the issue immediately, allowing the application to compile and run correctly under FPC 3.3.1 (with minor interface patches for `TJSONOption`).
## Recommendation
Please review the recent changes to `jsonscanner.pp` regarding backslash escape handling logic.
## Verification History
### December 29, 2025 - Bug Still Present
Verified with FPC 3.3.1-19122-ge8d90a3042 that the bug **persists**. All tests failed:
- Windows Path test: FAIL (got `\Windows` instead of `C:\Windows`)
- Simple Backslash test: FAIL (got `\B` instead of `A\B`)
- Double Backslash test: FAIL (got `\More` instead of `Test\\More`)
- Path with Spaces test: FAIL (got `\Test` instead of `C:\Program Files\Test`)
issue