{"record":{"id":"936e1d1fae39a2e0","repo":"apache/cassandra","slug":"expected-a-byte-value-but-got-a-s-s","errorCode":null,"errorMessage":"Expected a byte value, but got a %s: %s","messagePattern":"Expected a byte value, but got a (.+?): (.+?)","errorType":"validation","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/ByteType.java","lineNumber":92,"sourceCode":"\n        try\n        {\n            b = Byte.parseByte(source);\n        }\n        catch (Exception e)\n        {\n            throw new MarshalException(String.format(\"Unable to make byte from '%s'\", source), e);\n        }\n\n        return decompose(b);\n    }\n\n    public Term fromJSONObject(Object parsed) throws MarshalException\n    {\n        if (parsed instanceof String || parsed instanceof Number)\n            return new Constants.Value(fromString(String.valueOf(parsed)));\n\n        throw new MarshalException(String.format(\n                \"Expected a byte value, but got a %s: %s\", parsed.getClass().getSimpleName(), parsed));\n    }\n\n    @Override\n    public String toJSONString(ByteBuffer buffer, ProtocolVersion protocolVersion)\n    {\n        return getSerializer().deserialize(buffer).toString();\n    }\n\n    @Override\n    public CQL3Type asCQL3Type()\n    {\n        return CQL3Type.Native.TINYINT;\n    }\n\n    @Override\n    public TypeSerializer<Byte> getSerializer()\n    {","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/ByteType.java#L74-L110","documentation":"ByteType.fromJSONObject throws this when a JSON value for a byte column is neither a JSON string nor a JSON number. Only strings (parsed via fromString) and numbers are accepted; booleans, objects, arrays etc. are rejected with the class simple name and value in the message.","triggerScenarios":"INSERT INTO t JSON '{\"v\": true}' where v is a byte column; fromJson() with a boolean or object argument targeting a byte column; Term.fromJSONObject receiving e.g. Boolean or Map.","commonSituations":"JSON payloads where a byte field is accidentally a boolean flag; serializers emitting nested objects for numeric columns; schema drift between client models and Cassandra schema.","solutions":["Send a JSON number: {\"v\": 42} (or a quoted numeric string)","Coerce the value to a number in application code before JSON insert","Fix the client model so byte columns map to numeric fields","Validate JSON against schema types before sending"],"exampleFix":"// before\nINSERT INTO t JSON '{\"v\": true}';\n// after\nINSERT INTO t JSON '{\"v\": 42}';","handlingStrategy":"type-guard","validationCode":"if (!(v instanceof Number || v instanceof String)) throw new IllegalArgumentException(\"byte JSON value must be number or numeric string\");","typeGuard":"boolean isByteJson(Object v) { return v instanceof Number || v instanceof String; }","tryCatchPattern":"try { Term t = byteType.fromJSONObject(parsed); } catch (MarshalException e) { if (e.getMessage().startsWith(\"Expected a byte value\")) { /* fix payload type to number */ } else throw e; }","preventionTips":["Map byte columns to numeric JSON fields in client models","Reject booleans/objects for numeric columns at the serializer","Schema-validate JSON payloads before send","Keep client models in sync with Cassandra schema changes"],"tags":["cassandra","marshal","json","byte"],"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"}