{"record":{"id":"b9b53d00015ca979","repo":"apache/flink","slug":"illegal-json-map-data","errorCode":null,"errorMessage":"Illegal JSON map data...","messagePattern":"Illegal JSON map 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":379,"sourceCode":"            final Object[] array = (Object[]) Array.newInstance(elementClass, result.size());\n            return new GenericArrayData(result.toArray(array));\n        };\n    }\n\n    private JsonParserToRowDataConverter createMapConverter(\n            String typeSummary, LogicalType keyType, LogicalType valueType) {\n        if (!keyType.is(LogicalTypeFamily.CHARACTER_STRING)) {\n            throw new UnsupportedOperationException(\n                    \"JSON format doesn't support non-string as key type of map. \"\n                            + \"The type is: \"\n                            + typeSummary);\n        }\n        final JsonParserToRowDataConverter keyConverter = createConverter(keyType);\n        final JsonParserToRowDataConverter valueConverter = createConverter(valueType);\n\n        return jp -> {\n            if (jp.currentToken() != JsonToken.START_OBJECT) {\n                throw new IllegalStateException(\"Illegal JSON map data...\");\n            }\n            Map<Object, Object> result = new HashMap<>();\n            while (jp.nextToken() != JsonToken.END_OBJECT) {\n                Object key = keyConverter.convert(jp);\n                jp.nextToken();\n                Object value = valueConverter.convert(jp);\n                result.put(key, value);\n            }\n            return new GenericMapData(result);\n        };\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);","sourceCodeStart":361,"sourceCodeEnd":397,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonParserToRowDataConverters.java#L361-L397","documentation":"IllegalStateException from createMapConverter's lambda when the current token is not START_OBJECT while converting a MAP column — the JSON value at that position is a scalar or array where '{' ... '}' (a JSON object) is expected. Like the array variant, it is a payload-vs-schema shape mismatch.","triggerScenarios":"Schema declares MAP<STRING, T> but the payload has \"attrs\": [\"a\",\"b\"] or \"attrs\": 42; nested map where the value converter expects an object and finds another token.","commonSituations":"Producers emitting arrays of key-value pairs instead of objects; schema evolution between list and object forms; DDL written from documentation rather than real samples.","solutions":["Match the DDL to the real payload: ARRAY<STRING> / ARRAY<ROW<k STRING,v STRING>> for pair-lists, MAP<STRING,T> only for genuine JSON objects","Fix the producer to emit a JSON object for map fields","Validate a sample of the real data against the schema before deploying"],"exampleFix":"-- before\nattrs MAP<STRING, INT>   -- data is \"attrs\": [{\"k\":\"a\",\"v\":1}]\n\n-- after\nattrs ARRAY<ROW<k STRING, v INT>>","handlingStrategy":"validation","validationCode":"JsonNode n = mapper.readTree(sample).get(\"attrs\");\nif (!n.isObject()) throw new IllegalStateException(\"map field must be a JSON object\");","typeGuard":null,"tryCatchPattern":"catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"Illegal JSON map data\")) {\n        // schema says MAP but data is not an object; fix DDL or producer\n    }\n}","preventionTips":["Confirm each MAP column's payload is an object on real samples","Keep key-value pair lists as ARRAY<ROW<...>> in DDL"],"tags":["flink","json","map","schema-mismatch","data-quality"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}