{"record":{"id":"69d22efdf8683a2c","repo":"aio-libs/aiohttp","slug":"can-not-serialize-value-type-r-headers-r-val","errorCode":null,"errorMessage":"Can not serialize value type: %r\n headers: %r\n value: %r","messagePattern":"Can not serialize value type: %r\n headers: %r\n value: %r","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"aiohttp/formdata.py","lineNumber":143,"sourceCode":"        )\n\n    def _gen_form_data(self) -> multipart.MultipartWriter:\n        \"\"\"Encode a list of fields using the multipart/form-data MIME format\"\"\"\n        for dispparams, headers, value in self._fields:\n            try:\n                if hdrs.CONTENT_TYPE in headers:\n                    part = payload.get_payload(\n                        value,\n                        content_type=headers[hdrs.CONTENT_TYPE],\n                        headers=headers,\n                        encoding=self._charset,\n                    )\n                else:\n                    part = payload.get_payload(\n                        value, headers=headers, encoding=self._charset\n                    )\n            except Exception as exc:\n                raise TypeError(\n                    \"Can not serialize value type: %r\\n \"\n                    \"headers: %r\\n value: %r\" % (type(value), headers, value)\n                ) from exc\n\n            if dispparams:\n                part.set_content_disposition(\n                    \"form-data\", quote_fields=self._quote_fields, **dispparams\n                )\n                # FIXME cgi.FieldStorage doesn't likes body parts with\n                # Content-Length which were sent via chunked transfer encoding\n                assert part.headers is not None\n                part.headers.popall(hdrs.CONTENT_LENGTH, None)\n\n            self._writer.append_payload(part)\n\n        self._fields.clear()\n        return self._writer\n","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/d041d4d0fd48c3f0832084d33be16cf1c4835f85/aiohttp/formdata.py#L125-L161","documentation":"FormData._gen_form_data raises TypeError (wrapping the original exception) when payload.get_payload cannot find a registered payload type for a field value during multipart serialization. The error includes the value type, headers, and the value itself for diagnosis. This is the multipart counterpart of error 106.","triggerScenarios":"Adding a field whose value type has no registered aiohttp payload handler — e.g. a plain dict, a list, a custom Python object, or a set. Also triggered by passing an object that is not io.IOBase, bytes, str, or any type registered via payload.register_payload.","commonSituations":"Passing a JSON-serializable dict directly as a form field instead of serializing it first; passing a custom dataclass or ORM model instance; passing a list of values where a single value is expected.","solutions":["Serialize complex objects before adding: form.add_field('data', json.dumps(my_dict), content_type='application/json')","For file-like objects, wrap them in aiohttp.payload.AsyncIterablePayload or BufferedReaderPayload","Register a custom payload type with aiohttp.payload.register_payload if you need first-class support","Convert the value to str or bytes before adding"],"exampleFix":"# before\nform.add_field('config', {'key': 'value'})\n\n# after\nimport json\nform.add_field('config', json.dumps({'key': 'value'}), content_type='application/json')","handlingStrategy":"validation","validationCode":"import io, json\n\ndef to_payload_value(value):\n    \"\"\"Convert a value to something aiohttp can serialize.\"\"\"\n    if isinstance(value, (str, bytes, bytearray, memoryview, io.IOBase)):\n        return value\n    if isinstance(value, (dict, list)):\n        return json.dumps(value)\n    return str(value)\n\nform.add_field('field', to_payload_value(my_value))","typeGuard":"import io\ndef is_serializable_payload(value) -> bool:\n    return isinstance(value, (str, bytes, bytearray, memoryview, io.IOBase))","tryCatchPattern":"try:\n    form.add_field('field', value)\n    body = form()\nexcept TypeError as e:\n    if 'Can not serialize' in str(e):\n        # Fall back to JSON serialization\n        form._fields.pop()\n        form.add_field('field', json.dumps(value), content_type='application/json')\n    raise","preventionTips":["Never pass raw dicts, lists, or custom objects as form field values","Pre-serialize with json.dumps() or str() before adding to FormData","Register custom payload types for domain objects you use frequently"],"tags":["form-data","serialization","multipart","payload","type-error"],"backgroundTag":null,"analyzedSha":"d041d4d0fd48c3f0832084d33be16cf1c4835f85","analyzedAt":"2026-08-11T20:44:15.550Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}