{"record":{"id":"fa024c49a0a83be9","repo":"apache/cassandra","slug":"expected-a-list-representing-a-set-but-got-a-s","errorCode":null,"errorMessage":"Expected a list (representing a set), but got a %s: %s","messagePattern":"Expected a list \\(representing a set\\), but got a (.+?): (.+?)","errorType":"exception","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/SetType.java","lineNumber":232,"sourceCode":"        return bbs;\n    }\n\n    public List<byte[]> serializedValuesAsByteArrays(Iterator<Cell<?>> cells)\n    {\n        List<byte[]> bbs = new ArrayList<>();\n        while (cells.hasNext())\n            bbs.add(ByteBufferUtil.getArrayUnsafeNullable(cells.next().path().get(0)));\n        return bbs;\n    }\n\n    @Override\n    public Term fromJSONObject(Object parsed) throws MarshalException\n    {\n        if (parsed instanceof String)\n            parsed = JsonUtils.decodeJson((String) parsed);\n\n        if (!(parsed instanceof List))\n            throw new MarshalException(String.format(\n                    \"Expected a list (representing a set), but got a %s: %s\", parsed.getClass().getSimpleName(), parsed));\n\n        List<?> list = (List<?>) parsed;\n        List<Term> terms = new ArrayList<>(list.size());\n        for (Object element : list)\n        {\n            if (element == null)\n                throw new MarshalException(\"Invalid null element in set\");\n            terms.add(elements.fromJSONObject(element));\n        }\n\n        return new MultiElements.DelayedValue(this, terms);\n    }\n\n    @Override\n    public String toJSONString(ByteBuffer buffer, ProtocolVersion protocolVersion)\n    {\n        return setOrListToJsonString(buffer, elements, protocolVersion);","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/SetType.java#L214-L250","documentation":"SetType.fromJSONObject() converts a parsed JSON value into set Terms. JSON sets are represented as arrays, so the parsed value must be a java.util.List (after optionally decoding a JSON string); any other shape — object, number, boolean — raises this MarshalException.","triggerScenarios":"Calling fromJSONObject on SetType with a parsed Object that is not a List — e.g. a JSON object {\"a\":1}, a scalar 42, or true; or a string that fails JsonUtils.decodeJson into a list.","commonSituations":"CQL JSON inserts where a set column receives a JSON object or scalar; clients sending map-style payloads to set columns; double-encoded JSON strings.","solutions":["Send a JSON array for set columns: [1,2,3] instead of {\"1\":1} or a scalar.","Fix client serialization so set-typed fields emit JSON arrays.","Catch MarshalException around JSON term conversion and validate the payload is an array before submission."],"exampleFix":"// before\nINSERT INTO t (s) JSON '{\"s\": {\"1\":1}}';\n// after\nINSERT INTO t (s) JSON '{\"s\": [1, 2, 3]}';","handlingStrategy":"type-guard","validationCode":"if (!(parsedValue instanceof List))\n    throw new IllegalArgumentException(\"set column requires a JSON array, got: \" + parsedValue);","typeGuard":"static boolean isJsonArray(Object v) {\n    if (v instanceof String)\n        v = JsonUtils.decodeJson((String) v);\n    return v instanceof List;\n}","tryCatchPattern":"try {\n    Term term = setType.fromJSONObject(parsed);\n} catch (MarshalException e) {\n    // reject payload; log offending value\n}","preventionTips":["Emit JSON arrays for set columns","Add JSON schema validation with type: array for set fields","Do not send JSON objects or scalars to set columns"],"tags":["cassandra","json","set","type-mismatch"],"backgroundTag":"type-mismatch","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}