@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); } }
@Test public void shouldCreateJsonStringForStructIfDefinedAsVarchar() throws JsonProcessingException { final Schema schema = SchemaBuilder.struct() .field("itemid".toUpperCase(), Schema.OPTIONAL_STRING_SCHEMA) .build(); final KsqlJsonDeserializer deserializer = new KsqlJsonDeserializer( schema, false, recordLogger); final GenericRow expected = new GenericRow(Collections.singletonList( "{\"CATEGORY\":{\"ID\":2,\"NAME\":\"Food\"},\"ITEMID\":6,\"NAME\":\"Item_6\"}")); final GenericRow genericRow = deserializer.deserialize("", "{\"itemid\":{\"CATEGORY\":{\"ID\":2,\"NAME\":\"Food\"},\"ITEMID\":6,\"NAME\":\"Item_6\"}}".getBytes(StandardCharsets.UTF_8)); assertThat(genericRow, equalTo(expected)); }
@Test public void shouldDeserializeJsonCorrectlyWithRedundantFields() throws JsonProcessingException { final Map<String, Object> orderRow = new HashMap<>(); orderRow.put("ordertime", 1511897796092L); orderRow.put("@orderid", 1L); orderRow.put("itemid", "Item_1"); orderRow.put("orderunits", 10.0); orderRow.put("arraycol", new Double[]{10.0, 20.0}); orderRow.put("mapcol", Collections.singletonMap("key1", 10.0)); final byte[] jsonBytes = objectMapper.writeValueAsBytes(orderRow); final Schema newOrderSchema = SchemaBuilder.struct() .field("ordertime".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_INT64_SCHEMA) .field("orderid".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_INT64_SCHEMA) .field("itemid".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_STRING_SCHEMA) .field("orderunits".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_FLOAT64_SCHEMA) .build(); final KsqlJsonDeserializer ksqlJsonDeserializer = new KsqlJsonDeserializer( newOrderSchema, false, recordLogger); final GenericRow genericRow = ksqlJsonDeserializer.deserialize("", jsonBytes); assertThat(genericRow.getColumns().size(), equalTo(4)); assertThat(genericRow.getColumns().get(0), equalTo(1511897796092L)); assertThat(genericRow.getColumns().get(1), equalTo(1L)); assertThat(genericRow.getColumns().get(2), equalTo("Item_1")); assertThat(genericRow.getColumns().get(3), equalTo(10.0)); }
@Before public void before() { orderSchema = SchemaBuilder.struct() .field("ordertime".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_INT64_SCHEMA) .field("orderid".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_INT64_SCHEMA) .field("itemid".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_STRING_SCHEMA) .field("orderunits".toUpperCase(), org.apache.kafka.connect.data.Schema.OPTIONAL_FLOAT64_SCHEMA) .field("arraycol".toUpperCase(), SchemaBuilder.array(org.apache.kafka.connect.data.Schema.OPTIONAL_FLOAT64_SCHEMA).optional().build()) .field("mapcol".toUpperCase(), SchemaBuilder.map(org.apache.kafka.connect.data.Schema.OPTIONAL_STRING_SCHEMA, org.apache.kafka.connect.data.Schema.OPTIONAL_FLOAT64_SCHEMA).optional().build()) .build(); ksqlJsonDeserializer = new KsqlJsonDeserializer( orderSchema, false, recordLogger); }