{"record":{"id":"67fe8f41394a456d","repo":"OpenBB-finance/OpenBB","slug":"failed-to-convert-dataframe-to-json","errorCode":null,"errorMessage":"Failed to convert DataFrame to JSON","messagePattern":"Failed to convert DataFrame to JSON","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/extensions/platform_api/openbb_platform_api/response_models.py","lineNumber":252,"sourceCode":"        if content.__class__.__name__ == \"Figure\":\n            values.parse_as = \"chart\"\n            try:\n                content = content.to_json()\n            except Exception as e:\n                raise ValueError(\"Failed to convert chart to JSON\") from e\n            values.content = content\n        elif isinstance(content, dict) and \"layout\" in content and \"data\" in content:\n            values.parse_as = \"chart\"\n        elif isinstance(content, list) and all(\n            isinstance(item, dict) for item in content\n        ):\n            values.parse_as = \"table\"\n        elif isinstance(content, pd.DataFrame):\n            values.parse_as = \"table\"\n            try:\n                content = json.loads(content.to_json(orient=\"records\"))\n            except Exception as e:\n                raise ValueError(\"Failed to convert DataFrame to JSON\") from e\n            values.content = content\n        elif isinstance(content, dict) and all(\n            isinstance(v, list) for v in content.values()\n        ):\n            values.parse_as = \"table\"\n            try:\n                df = pd.DataFrame(content)\n                content = json.loads(df.to_json(orient=\"records\"))\n            except Exception as e:\n                raise ValueError(\n                    \"Failed to convert dictionary of lists to list of records\"\n                ) from e\n            values.content = content\n        elif isinstance(content, str) and content.strip():  # pylint: disable=R0916\n            try:\n                content = json.loads(content)\n            except json.JSONDecodeError:\n                # Remove trailing commas in objects and arrays","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/extensions/platform_api/openbb_platform_api/response_models.py#L234-L270","documentation":"Thrown by the OmniWidgetResponseModel model_validator when content is a pandas DataFrame and DataFrame.to_json(orient='records') fails (or its output cannot be re-parsed with json.loads). The validator converts tabular data into a list of records for the widget layer; any serialization failure is re-raised as this ValueError.","triggerScenarios":"Constructing OmniWidgetResponseModel(content=df) where df contains values pandas to_json cannot encode, or where the DataFrame uses non-string-MAX pathologies (e.g. mixed-type object columns with custom classes, Decimal, or unhashable objects) that break the JSON encoder.","commonSituations":"Handing a raw provider response DataFrame containing Data/BaseModel objects in cells; DataFrames built from records with numpy scalars in object columns; pandas version differences in to_json handling of NaN and mixed dtypes.","solutions":["Inspect e.__cause__ from the raised ValueError to find the offending column/value.","Convert problem columns before constructing the model: df = df.convert_dtypes() or df = df.astype(object).where(df.notna(), None).","Pass the records yourself: content=df.to_json(orient='records') as a pre-serialized string, or content=json.loads(df.to_json(orient='records')).","Drop or stringify non-serializable object columns (e.g. columns holding nested Data models)."],"exampleFix":"# before\nresp = OmniWidgetResponseModel(content=df_with_object_cols)\n\n# after\nrecords = json.loads(df.to_json(orient=\"records\"))\nresp = OmniWidgetResponseModel(content=records)","handlingStrategy":"validation","validationCode":"records = json.loads(df.to_json(orient=\"records\"))\nresp = OmniWidgetResponseModel(content=records)","typeGuard":"import pandas as pd\ndef is_serializable_dataframe(obj) -> bool:\n    if not isinstance(obj, pd.DataFrame):\n        return False\n    try:\n        obj.to_json(orient=\"records\")\n        return True\n    except Exception:\n        return False","tryCatchPattern":"try:\n    resp = OmniWidgetResponseModel(content=df)\nexcept ValueError as e:\n    if \"DataFrame to JSON\" in str(e):\n        df = df.convert_dtypes()\n        resp = OmniWidgetResponseModel(content=json.loads(df.to_json(orient=\"records\")))\n    else:\n        raise","preventionTips":["Convert object columns to primitives before widget construction","Test df.to_json() in unit tests for provider DataFrames","Use .to_df() outputs which are already JSON-safe"],"tags":["pandas","serialization","pydantic","widget"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}