{"record":{"id":"fedcd4f115167058","repo":"provectus/kafka-ui","slug":"string-is-not-a-valid-json","errorCode":null,"errorMessage":"String is not a valid json","messagePattern":"String is not a valid json","errorType":"validation","errorClass":"JsonAvroConversionException","httpStatus":400,"severity":"error","filePath":"kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/JsonAvroConversion.java","lineNumber":56,"sourceCode":"import org.apache.avro.Schema;\nimport org.apache.avro.generic.GenericData;\n\n// json <-> avro\npublic class JsonAvroConversion {\n\n  private static final JsonMapper MAPPER = new JsonMapper();\n  private static final Schema NULL_SCHEMA = Schema.create(Schema.Type.NULL);\n  private static final String FORMAT = \"format\";\n  private static final String DATE_TIME = \"date-time\";\n\n  // converts json into Object that is expected input for KafkaAvroSerializer\n  // (with AVRO_USE_LOGICAL_TYPE_CONVERTERS flat enabled!)\n  public static Object convertJsonToAvro(String jsonString, Schema avroSchema) {\n    JsonNode rootNode = null;\n    try {\n      rootNode = MAPPER.readTree(jsonString);\n    } catch (JsonProcessingException e) {\n      throw new JsonAvroConversionException(\"String is not a valid json\");\n    }\n    return convert(rootNode, avroSchema);\n  }\n\n  private static Object convert(JsonNode node, Schema avroSchema) {\n    return switch (avroSchema.getType()) {\n      case RECORD -> {\n        assertJsonType(node, JsonNodeType.OBJECT);\n        var rec = new GenericData.Record(avroSchema);\n        for (Schema.Field field : avroSchema.getFields()) {\n          if (node.has(field.name()) && !node.get(field.name()).isNull()) {\n            rec.put(field.name(), convert(node.get(field.name()), field.schema()));\n          }\n        }\n        yield rec;\n      }\n      case MAP -> {\n        assertJsonType(node, JsonNodeType.OBJECT);","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/provectus/kafka-ui/blob/83b5a60cc08501b570a0c4d0b4cdfceb1b88d6b7/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/JsonAvroConversion.java#L38-L74","documentation":"JsonAvroConversion.convertJsonToAvro wraps Jackson's readTree in a try/catch and rethrows any JsonProcessingException as a JsonAvroConversionException with message \"String is not a valid json\". It means the payload string passed for JSON-to-Avro conversion could not be parsed as JSON at all, before any Avro schema validation happens. This is a client-side input format error, not a schema or Kafka problem.","triggerScenarios":"Calling convertJsonToAvro(jsonString, avroSchema) with a string that is not syntactically valid JSON, e.g. raw Java/JavaScript object literal like {name: 'x'} (unquoted keys, single quotes), trailing commas, truncated JSON, or an empty/whitespace string.","commonSituations":"Users pasting a record payload into the kafka-ui 'produce message' form with quotes stripped or copied from a log line; string-concatenated JSON built by hand; payloads that were serialized with Avro/protobuf and pasted as-is instead of valid JSON.","solutions":["Validate the payload with any JSON parser (e.g. MAPPER.readTree(json) or JSON.parse) before submitting; fix syntax errors (quote keys, use double quotes, remove trailing commas).","Check that the string was not truncated or double-escaped during copy/paste or transport (e.g. nested quotes escaped twice).","If generating JSON programmatically, use a serializer (Jackson ObjectMapper.writeValueAsString) instead of string concatenation."],"exampleFix":"// before\nString json = \"{name: 'sensor-1', value: 42}\"; // invalid: single quotes, unquoted key\nObject avro = JsonAvroConversion.convertJsonToAvro(json, schema);\n\n// after\nString json = \"{\\\"name\\\": \\\"sensor-1\\\", \\\"value\\\": 42}\";\nObject avro = JsonAvroConversion.convertJsonToAvro(json, schema);","handlingStrategy":"validation","validationCode":"try {\n  new ObjectMapper().readTree(jsonString);\n} catch (JsonProcessingException e) {\n  throw new IllegalArgumentException(\"Payload is not valid JSON: \" + e.getOriginalMessage());\n}","typeGuard":null,"tryCatchPattern":"try {\n  Object avro = JsonAvroConversion.convertJsonToAvro(json, schema);\n} catch (JsonAvroConversionException e) {\n  if (e.getMessage().equals(\"String is not a valid json\")) {\n    // surface a JSON syntax error to the user / reject the record\n  }\n}","preventionTips":["Always validate JSON with a parser before submitting payloads.","Generate JSON with a serializer, never by string concatenation.","When copying payloads from logs, check for truncation and re-escaping."],"tags":["json","avro","validation","input-format"],"backgroundTag":"json-parse-error","analyzedSha":"83b5a60cc08501b570a0c4d0b4cdfceb1b88d6b7","analyzedAt":"2026-09-08T04:35:39.002Z","contentChangedAt":"2026-09-08T04:35:39.002Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}