{"record":{"id":"f59ab9741afef3c5","repo":"apache/cassandra","slug":"invalid-null-element-in-set","errorCode":null,"errorMessage":"Invalid null element in set","messagePattern":"Invalid null element in set","errorType":"validation","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/SetType.java","lineNumber":240,"sourceCode":"        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);\n    }\n\n    @Override\n    public void forEach(ByteBuffer input, Consumer<ByteBuffer> action)\n    {\n        serializer.forEach(input, action);\n    }\n","sourceCodeStart":222,"sourceCodeEnd":258,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/SetType.java#L222-L258","documentation":"SetType.fromJSONObject() iterates the decoded JSON array and rejects any null element, because Cassandra sets cannot contain null values. A null in the list raises MarshalException before element terms are built.","triggerScenarios":"Calling fromJSONObject on SetType with a List containing null — e.g. JSON like {\"s\": [1, null, 3]}.","commonSituations":"Ingestion pipelines preserving nulls from upstream arrays; clients serializing absent values as null inside JSON arrays; JSON sources containing explicit null array items.","solutions":["Remove null elements from the JSON array before sending.","Filter nulls from the decoded List programmatically before calling fromJSONObject.","Catch MarshalException and surface which set field contained a null element."],"exampleFix":"// before\n{\"s\": [1, null, 3]}\n// after\n{\"s\": [1, 3]}","handlingStrategy":"validation","validationCode":"List<?> list = (List<?>) decoded;\nif (list.stream().anyMatch(Objects::isNull))\n    throw new IllegalArgumentException(\"set contains a null element\");","typeGuard":null,"tryCatchPattern":"try {\n    Term term = setType.fromJSONObject(parsed);\n} catch (MarshalException e) {\n    if (e.getMessage().contains(\"null element\")) {\n        // strip nulls from list and retry\n    }\n}","preventionTips":["Strip null items from JSON arrays before ingest","Model absence by omitting elements, not by sending null","Sanitize decoded lists: list.removeIf(Objects::isNull)"],"tags":["cassandra","json","set","null"],"backgroundTag":"null-argument","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"}