@Override protected Serializer<GenericRow> getSerializer( final Schema avroSchema, final org.apache.kafka.connect.data.Schema kafkaSchema, final String topicName ) { return new KsqlJsonSerializer(kafkaSchema); } }
@Test public void shouldSerializeRowCorrectly() { final List columns = Arrays.asList(1511897796092L, 1L, "item_1", 10.0, Arrays.asList(100.0), Collections.singletonMap("key1", 100.0)); final GenericRow genericRow = new GenericRow(columns); final KsqlJsonSerializer ksqlJsonDeserializer = new KsqlJsonSerializer(orderSchema); final byte[] bytes = ksqlJsonDeserializer.serialize("t1", genericRow); final String jsonString = new String(bytes, StandardCharsets.UTF_8); assertThat("Incorrect serialization.", jsonString, equalTo( "{\"ORDERTIME\":1511897796092,\"ORDERID\":1,\"ITEMID\":\"item_1\",\"ORDERUNITS\":10.0,\"ARRAYCOL\":[100.0],\"MAPCOL\":{\"key1\":100.0}}")); }
private boolean compareSchemas(final Schema schema1, final Schema schema2) { if (schema1.type() != schema2.type()) { return false; } switch (schema1.type()) { case STRUCT: return compareStructSchema(schema1, schema2); case ARRAY: return compareSchemas(schema1.valueSchema(), schema2.valueSchema()); case MAP: return compareSchemas(schema1.valueSchema(), schema2.valueSchema()) && compareSchemas(schema1.keySchema(), schema2.keySchema()); default: return true; } }
private boolean compareStructSchema(final Schema schema1, final Schema schema2) { if (schema1.fields().size() != schema2.fields().size()) { return false; } for (int i = 0; i < schema1.fields().size(); i++) { if (!schema1.fields().get(i).name().equalsIgnoreCase(schema2.fields().get(i).name()) || !compareSchemas(schema1.fields().get(i).schema(), schema2.fields().get(i).schema())) { return false; } } return true; }
@Test public void shouldSerializeRowWithNull() { final List columns = Arrays.asList(1511897796092L, 1L, "item_1", 10.0, null, null); final GenericRow genericRow = new GenericRow(columns); final KsqlJsonSerializer ksqlJsonDeserializer = new KsqlJsonSerializer(orderSchema); final byte[] bytes = ksqlJsonDeserializer.serialize("t1", genericRow); final String jsonString = new String(bytes, StandardCharsets.UTF_8); assertThat("Incorrect serialization.", jsonString, equalTo( "{\"ORDERTIME\":1511897796092,\"ORDERID\":1,\"ITEMID\":\"item_1\",\"ORDERUNITS\":10.0,\"ARRAYCOL\":null,\"MAPCOL\":null}")); }
@Test public void shouldHandleStruct() throws IOException { final KsqlJsonSerializer jsonSerializer = new KsqlJsonSerializer(getSchemaWithStruct()); final GenericRow genericRow = getGenericRow(); final byte[] bytes = jsonSerializer.serialize("", genericRow); final ObjectMapper objectMapper = new ObjectMapper(); final JsonNode jsonNode = objectMapper.readTree(bytes); assertThat(jsonNode.size(), equalTo(7)); assertThat(jsonNode.get("ordertime").asLong(), equalTo(genericRow.getColumns().get(0))); assertThat(jsonNode.get("itemid").get("NAME").asText(), equalTo("Item_10")); }
@Override public Serde<GenericRow> getGenericRowSerde(final Schema schema, final KsqlConfig ksqlConfig, final boolean isInternal, final Supplier<SchemaRegistryClient> schemaRegistryClientFactory, final String loggerNamePrefix) { final Map<String, Object> serdeProps = new HashMap<>(); serdeProps.put("JsonPOJOClass", GenericRow.class); final Serializer<GenericRow> genericRowSerializer = new KsqlJsonSerializer(schema); genericRowSerializer.configure(serdeProps, false); final Deserializer<GenericRow> genericRowDeserializer = new KsqlJsonDeserializer( schema, isInternal, ProcessingLoggerFactory.getLogger( join(loggerNamePrefix, SerdeUtils.DESERIALIZER_LOGGER_NAME)) ); genericRowDeserializer.configure(serdeProps, false); return Serdes.serdeFrom(genericRowSerializer, genericRowDeserializer); } }