{"record":{"id":"e63d53c850f043ae","repo":"apache/cassandra","slug":"expected-a-boolean-value-but-got-a-s-s","errorCode":null,"errorMessage":"Expected a boolean value, but got a %s: %s","messagePattern":"Expected a boolean value, but got a (.+?): (.+?)","errorType":"validation","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/BooleanType.java","lineNumber":102,"sourceCode":"    public ByteBuffer fromString(String source) throws MarshalException\n    {\n\n        if (source.isEmpty()|| source.equalsIgnoreCase(Boolean.FALSE.toString()))\n            return decompose(false);\n\n        if (source.equalsIgnoreCase(Boolean.TRUE.toString()))\n            return decompose(true);\n\n        throw new MarshalException(String.format(\"Unable to make boolean from '%s'\", source));\n    }\n\n    @Override\n    public Term fromJSONObject(Object parsed) throws MarshalException\n    {\n        if (parsed instanceof String)\n            return new Constants.Value(fromString((String) parsed));\n        else if (!(parsed instanceof Boolean))\n            throw new MarshalException(String.format(\n                    \"Expected a boolean value, but got a %s: %s\", parsed.getClass().getSimpleName(), parsed));\n\n        return new Constants.Value(getSerializer().serialize((Boolean) parsed));\n    }\n\n    @Override\n    public String toJSONString(ByteBuffer buffer, ProtocolVersion protocolVersion)\n    {\n        return getSerializer().deserialize(buffer).toString();\n    }\n\n    public CQL3Type asCQL3Type()\n    {\n        return CQL3Type.Native.BOOLEAN;\n    }\n\n    public TypeSerializer<Boolean> getSerializer()\n    {","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/BooleanType.java#L84-L120","documentation":"BooleanType.fromJSONObject throws this when a JSON value for a boolean column is neither a JSON string nor a JSON boolean. Strings go through fromString; any other JSON type (number, object, array) is rejected with the Java class simple name and value in the message.","triggerScenarios":"INSERT INTO t JSON '{\"flag\": 1}' where flag is boolean (JSON number not allowed); fromJson() with numeric argument for boolean column; Term.fromJSONObject receiving e.g. Integer or Double for a boolean field.","commonSituations":"JSON APIs that encode booleans as 0/1; hand-written JSON payloads using unquoted 1/0; ORMs or serializers emitting integers for booleans; older payloads written before the column became boolean.","solutions":["Send a JSON boolean: {\"flag\": true} (or a quoted \"true\"/\"false\" string)","Convert 0/1 to true/false in application code before JSON insert","Change column type to tinyint if numeric flags are the real requirement","Validate JSON payload against column types before sending"],"exampleFix":"// before\nINSERT INTO t JSON '{\"flag\": 1}';\n// after\nINSERT INTO t JSON '{\"flag\": true}';","handlingStrategy":"type-guard","validationCode":"Object v = jsonNode.isTextual() ? jsonNode.textValue() : (jsonNode.isBoolean() ? jsonNode.booleanValue() : REJECT);","typeGuard":"boolean isBooleanJson(Object v) { return v instanceof Boolean || (v instanceof String && (((String) v).equalsIgnoreCase(\"true\") || ((String) v).equalsIgnoreCase(\"false\"))); }","tryCatchPattern":"try { Term t = boolType.fromJSONObject(parsed); } catch (MarshalException e) { if (e.getMessage().startsWith(\"Expected a boolean value\")) { /* coerce 0/1 -> true/false */ } else throw e; }","preventionTips":["Send JSON booleans as true/false, never 1/0","Configure serializers to emit native JSON booleans","Validate payload schema before insert","Coerce common 0/1 encodings client-side"],"tags":["cassandra","marshal","json","boolean"],"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"}