{"record":{"id":"8ed0d44259e13e8d","repo":"apache/flink","slug":"illegal-json-object-data","errorCode":null,"errorMessage":"Illegal JSON object data...","messagePattern":"Illegal JSON object data\\.\\.\\.","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonParserToRowDataConverters.java","lineNumber":407,"sourceCode":"        };\n    }\n\n    public JsonParserToRowDataConverter createRowConverter(RowType rowType) {\n        final JsonParserToRowDataConverter[] fieldConverters =\n                rowType.getFields().stream()\n                        .map(RowType.RowField::getType)\n                        .map(this::createConverter)\n                        .toArray(JsonParserToRowDataConverter[]::new);\n        final String[] fieldNames = rowType.getFieldNames().toArray(new String[0]);\n\n        Map<String, Integer> nameIdxMap = new HashMap<>();\n        for (int i = 0; i < rowType.getFieldCount(); i++) {\n            nameIdxMap.put(fieldNames[i], i);\n        }\n\n        return jp -> {\n            if (jp.currentToken() != JsonToken.START_OBJECT) {\n                throw new IllegalStateException(\"Illegal JSON object data...\");\n            }\n            int arity = nameIdxMap.size();\n            GenericRowData row = new GenericRowData(arity);\n            int cnt = 0;\n            jp.nextToken();\n            while (jp.currentToken() != JsonToken.END_OBJECT) {\n                if (cnt >= arity) {\n                    skipToNextField(jp);\n                    continue;\n                }\n                String fieldName = jp.getText();\n                jp.nextToken();\n                Integer idx = nameIdxMap.get(fieldName);\n                if (idx != null) {\n                    try {\n                        Object convertField = fieldConverters[idx].convert(jp);\n                        row.setField(idx, convertField);\n                    } catch (Throwable t) {","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonParserToRowDataConverters.java#L389-L425","documentation":"IllegalStateException from createRowConverter's lambda when the root token is not START_OBJECT — the JSON record for a ROW-typed schema must be a JSON object '{...}', but the payload at that position is a scalar, array, or the stream is malformed at that point. This guards every top-level row and nested ROW conversion.","triggerScenarios":"Kafka message contains a bare number/string ('42', '\"ok\"') instead of an object; a JSON array element is not an object when converting nested ROWs; trailing garbage making the token stream diverge.","commonSituations":"Topics mixing control/heartbeat messages with data; producers sending JSON-encoded scalars for empty payloads; newline-delimited JSON split incorrectly.","solutions":["Ensure each record is a complete JSON object matching the DDL columns","Filter/quarantine non-object messages at the source (e.g., a preceding filter or topic separation)","With 'json.ignore-parse-errors'='true' such records are skipped instead of failing the job"],"exampleFix":"// producer: before\nproducer.send(new ProducerRecord<>(topic, \"42\"));\n\n// after\nproducer.send(new ProducerRecord<>(topic, \"{\\\"value\\\": 42}\"));","handlingStrategy":"validation","validationCode":"JsonNode n = mapper.readTree(sample); // root must be an object for row schemas\nif (!n.isObject()) throw new IllegalStateException(\"each record must be a JSON object\");","typeGuard":null,"tryCatchPattern":"catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"Illegal JSON object data\")) {\n        // non-object record hit a ROW schema; filter or fix producer\n    }\n}","preventionTips":["Separate control/heartbeat messages from data records at the source","Ensure encoders always emit objects for row-typed records"],"tags":["flink","json","row","schema-mismatch","data-quality"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}