private ObjectMapper objectMapper() { if (this.objectMapper == null) { synchronized (this) { if (this.objectMapper == null) { this.objectMapper = newObjectMapperWith(RowJsonDeserializer.forSchema(this.schema)); } } } return this.objectMapper; } }
private Row parsePayloadJsonRow(PubsubMessage pubsubMessage) { String payloadJson = new String(pubsubMessage.getPayload(), StandardCharsets.UTF_8); if (objectMapper == null) { objectMapper = newObjectMapperWith(RowJsonDeserializer.forSchema(payloadSchema())); } return JsonToRowUtils.jsonToRow(objectMapper, payloadJson); }
private void testUnsupportedConversion(FieldType fieldType, String jsonFieldValue) throws Exception { String fieldName = "f_" + fieldType.getTypeName().name().toLowerCase(); ObjectMapper jsonParser = newObjectMapperWith(RowJsonDeserializer.forSchema(schemaWithField(fieldName, fieldType))); thrown.expectMessage(fieldName); thrown.expectCause(unsupportedWithMessage(jsonFieldValue, "out of range")); jsonParser.readValue(jsonObjectWith(fieldName, jsonFieldValue), Row.class); }
@Test public void testParsesArrayOfArrays() throws Exception { Schema schema = Schema.builder() .addArrayField("f_arrayOfIntArrays", FieldType.array(FieldType.INT32)) .build(); String rowString = "{\n" + "\"f_arrayOfIntArrays\" : [ [1, 2], [3, 4], [5]]\n" + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); Row parsedRow = newObjectMapperWith(deserializer).readValue(rowString, Row.class); Row expectedRow = Row.withSchema(schema) .addArray(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5)) .build(); assertEquals(expectedRow, parsedRow); }
private void testSupportedConversion( FieldType fieldType, String jsonFieldValue, Object expectedRowFieldValue) throws Exception { String fieldName = "f_" + fieldType.getTypeName().name().toLowerCase(); Schema schema = schemaWithField(fieldName, fieldType); Row expectedRow = Row.withSchema(schema).addValues(expectedRowFieldValue).build(); ObjectMapper jsonParser = newObjectMapperWith(RowJsonDeserializer.forSchema(schema)); Row parsedRow = jsonParser.readValue(jsonObjectWith(fieldName, jsonFieldValue), Row.class); assertEquals(expectedRow, parsedRow); }
@Test public void testThrowsForUnsupportedType() throws Exception { Schema schema = Schema.builder().addDateTimeField("f_dateTime").build(); thrown.expect(UnsupportedRowJsonException.class); thrown.expectMessage("DATETIME is not supported"); RowJsonDeserializer.forSchema(schema); }
@Test public void testThrowsForMissingNotNullableField() throws Exception { Schema schema = Schema.builder().addByteField("f_byte").addStringField("f_string").build(); String rowString = "{\n" + "\"f_byte\" : 12\n" + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); thrown.expect(UnsupportedRowJsonException.class); thrown.expectMessage("'f_string' is not present"); newObjectMapperWith(deserializer).readValue(rowString, Row.class); }
@Test public void testParsesArrayField() throws Exception { Schema schema = Schema.builder() .addInt32Field("f_int32") .addArrayField("f_intArray", FieldType.INT32) .build(); String rowString = "{\n" + "\"f_int32\" : 32,\n" + "\"f_intArray\" : [ 1, 2, 3, 4, 5]\n" + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); Row parsedRow = newObjectMapperWith(deserializer).readValue(rowString, Row.class); Row expectedRow = Row.withSchema(schema).addValues(32, Arrays.asList(1, 2, 3, 4, 5)).build(); assertEquals(expectedRow, parsedRow); }
@Test public void testThrowsForUnsupportedArrayElementType() throws Exception { Schema schema = Schema.builder().addArrayField("f_dateTimeArray", FieldType.DATETIME).build(); thrown.expect(UnsupportedRowJsonException.class); thrown.expectMessage("DATETIME is not supported"); RowJsonDeserializer.forSchema(schema); }
@Test public void testThrowsForMismatchedArrayField() throws Exception { Schema schema = Schema.builder() .addArrayField("f_arrayOfIntArrays", FieldType.array(FieldType.INT32)) .build(); String rowString = "{\n" + "\"f_arrayOfIntArrays\" : { }\n" // expect array, get object + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); thrown.expect(UnsupportedRowJsonException.class); thrown.expectMessage("Expected JSON array"); newObjectMapperWith(deserializer).readValue(rowString, Row.class); }
@Test public void testParsesNulls() throws Exception { Schema schema = Schema.builder() .addByteField("f_byte") .addNullableField("f_string", FieldType.STRING) .build(); String rowString = "{\n" + "\"f_byte\" : 12,\n" + "\"f_string\" : null\n" + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); Row parsedRow = newObjectMapperWith(deserializer).readValue(rowString, Row.class); Row expectedRow = Row.withSchema(schema).addValues((byte) 12, null).build(); assertEquals(expectedRow, parsedRow); }
@Test public void testThrowsForUnsupportedNestedFieldType() throws Exception { Schema nestedSchema = Schema.builder().addArrayField("f_dateTimeArray", FieldType.DATETIME).build(); Schema schema = Schema.builder().addRowField("f_nestedRow", nestedSchema).build(); thrown.expect(UnsupportedRowJsonException.class); thrown.expectMessage("DATETIME is not supported"); RowJsonDeserializer.forSchema(schema); }
@Test public void testThrowsForMismatchedRowField() throws Exception { Schema nestedRowSchema = Schema.builder().addInt32Field("f_nestedInt32").addStringField("f_nestedString").build(); Schema schema = Schema.builder().addInt32Field("f_int32").addRowField("f_row", nestedRowSchema).build(); String rowString = "{\n" + "\"f_int32\" : 32,\n" + "\"f_row\" : []\n" // expect object, get array + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); thrown.expect(UnsupportedRowJsonException.class); thrown.expectMessage("Expected JSON object"); newObjectMapperWith(deserializer).readValue(rowString, Row.class); }
@Test public void testParsesRowField() throws Exception { Schema nestedRowSchema = Schema.builder().addInt32Field("f_nestedInt32").addStringField("f_nestedString").build(); Schema schema = Schema.builder().addInt32Field("f_int32").addRowField("f_row", nestedRowSchema).build(); String rowString = "{\n" + "\"f_int32\" : 32,\n" + "\"f_row\" : {\n" + " \"f_nestedInt32\" : 54,\n" + " \"f_nestedString\" : \"foo\"\n" + " }\n" + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); Row parsedRow = newObjectMapperWith(deserializer).readValue(rowString, Row.class); Row expectedRow = Row.withSchema(schema) .addValues(32, Row.withSchema(nestedRowSchema).addValues(54, "foo").build()) .build(); assertEquals(expectedRow, parsedRow); }
+ "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema);
@Test public void testParsesNestedRowField() throws Exception { Schema doubleNestedRowSchema = Schema.builder().addStringField("f_doubleNestedString").build(); Schema nestedRowSchema = Schema.builder().addRowField("f_nestedRow", doubleNestedRowSchema).build(); Schema schema = Schema.builder().addRowField("f_row", nestedRowSchema).build(); String rowString = "{\n" + "\"f_row\" : {\n" + " \"f_nestedRow\" : {\n" + " \"f_doubleNestedString\":\"foo\"\n" + " }\n" + " }\n" + "}"; RowJsonDeserializer deserializer = RowJsonDeserializer.forSchema(schema); Row parsedRow = newObjectMapperWith(deserializer).readValue(rowString, Row.class); Row expectedRow = Row.withSchema(schema) .addValues( Row.withSchema(nestedRowSchema) .addValues(Row.withSchema(doubleNestedRowSchema).addValues("foo").build()) .build()) .build(); assertEquals(expectedRow, parsedRow); }