{"record":{"id":"0caa9d09203e7750","repo":"PHPOffice/PhpSpreadsheet","slug":"spreadsheet-objects-cannot-be-json-encoded","errorCode":null,"errorMessage":"Spreadsheet objects cannot be json encoded","messagePattern":"Spreadsheet objects cannot be json encoded","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Spreadsheet.php","lineNumber":1728,"sourceCode":"    public function reevaluateAutoFilters(bool $resetToMax): void\n    {\n        foreach ($this->workSheetCollection as $sheet) {\n            $filter = $sheet->getAutoFilter();\n            if (!empty($filter->getRange())) {\n                if ($resetToMax) {\n                    $filter->setRangeToMaxRow();\n                }\n                $filter->showHideRows();\n            }\n        }\n    }\n\n    /**\n     * @throws Exception\n     */\n    public function jsonSerialize(): mixed\n    {\n        throw new Exception('Spreadsheet objects cannot be json encoded');\n    }\n\n    public function resetThemeFonts(): void\n    {\n        $majorFontLatin = $this->theme->getMajorFontLatin();\n        $minorFontLatin = $this->theme->getMinorFontLatin();\n        foreach ($this->cellXfCollection as $cellStyleXf) {\n            $scheme = $cellStyleXf->getFont()->getScheme();\n            if ($scheme === 'major') {\n                $cellStyleXf->getFont()->setName($majorFontLatin)->setScheme($scheme);\n            } elseif ($scheme === 'minor') {\n                $cellStyleXf->getFont()->setName($minorFontLatin)->setScheme($scheme);\n            }\n        }\n        foreach ($this->cellStyleXfCollection as $cellStyleXf) {\n            $scheme = $cellStyleXf->getFont()->getScheme();\n            if ($scheme === 'major') {\n                $cellStyleXf->getFont()->setName($majorFontLatin)->setScheme($scheme);","sourceCodeStart":1710,"sourceCodeEnd":1746,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Spreadsheet.php#L1710-L1746","documentation":"Spreadsheet implements JsonSerializable but its jsonSerialize() always throws: workbooks contain cyclic object graphs, file-backed resources and non-representable internals, so there is no meaningful JSON form. Any attempt to json_encode() a Spreadsheet instance (or an array/object graph containing one) triggers this exception by design.","triggerScenarios":"json_encode($spreadsheet); returning a Spreadsheet from a Laravel/API controller (response()->json(...)); serializers (Symfony serializer, JMS) configured to walk JsonSerializable objects; logging frameworks that JSON-dump context variables that happen to hold a Spreadsheet.","commonSituations":"REST endpoints that try to echo an export object instead of the generated file; debug logging of large state arrays; queues serializing payloads to JSON; generic 'toArray then json' helper applied to the wrong object.","solutions":["Convert to data first: $rows = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); then json_encode($rows).","Save to a file and return the path/URL instead of the object: IOFactory::createWriter($spreadsheet, 'Xlsx')->save($path);","Extract only the fields you need (sheet names, specific cell ranges) into a plain array before encoding.","Keep Spreadsheet instances out of logger context and queue payloads."],"exampleFix":"// before\nreturn response()->json(['spreadsheet' => $spreadsheet]); // throws\n\n// after\n$data = [\n    'sheetNames' => $spreadsheet->getSheetNames(),\n    'rows' => $spreadsheet->getActiveSheet()->toArray(null, true, true, true),\n];\nreturn response()->json($data);","handlingStrategy":"validation","validationCode":"// Extract plain data before encoding\n$payload = [\n    'sheetNames' => $spreadsheet->getSheetNames(),\n    'rows' => $spreadsheet->getActiveSheet()->toArray(null, true, true, true),\n];\njson_encode($payload);","typeGuard":"function isJsonEncodable(mixed $v): bool\n{\n    return !($v instanceof \\PhpOffice\\PhpSpreadsheet\\Spreadsheet);\n}","tryCatchPattern":"try {\n    $json = json_encode($spreadsheet, flags: JSON_THROW_ON_ERROR);\n} catch (\\JsonException | \\PhpOffice\\PhpSpreadsheet\\Exception $e) {\n    $json = json_encode($spreadsheet->getActiveSheet()->toArray(null, true, true, true));\n}","preventionTips":["Return generated files or extracted arrays from APIs, never the object.","Keep Spreadsheet out of log context and queue payloads.","Centralize a toPayload($spreadsheet) helper for consistent extraction."],"tags":["json","jsonencode","not-serializable","phpspreadsheet"],"backgroundTag":"not-json-serializable","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}