You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ja...@apache.org on 2020/12/09 05:44:09 UTC

[flink] branch release-1.12 updated: [FLINK-20470][json] MissingNode can't be casted to ObjectNode when deserializing JSON

This is an automated email from the ASF dual-hosted git repository.

jark pushed a commit to branch release-1.12
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/release-1.12 by this push:
     new 9a2d4c2  [FLINK-20470][json] MissingNode can't be casted to ObjectNode when deserializing JSON
9a2d4c2 is described below

commit 9a2d4c2e23de074e0aafebf72c23d5a95cf76614
Author: zhuxiaoshang <31...@users.noreply.github.com>
AuthorDate: Wed Dec 9 13:35:48 2020 +0800

    [FLINK-20470][json] MissingNode can't be casted to ObjectNode when deserializing JSON
    
    This closes #14316
---
 .../flink/formats/json/JsonRowDataDeserializationSchema.java  |  2 +-
 .../apache/flink/formats/json/JsonToRowDataConverters.java    |  4 ++--
 .../apache/flink/formats/json/JsonRowDataSerDeSchemaTest.java | 11 +++++++++++
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonRowDataDeserializationSchema.java b/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonRowDataDeserializationSchema.java
index 78a3247..0a2fb5e 100644
--- a/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonRowDataDeserializationSchema.java
+++ b/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonRowDataDeserializationSchema.java
@@ -89,7 +89,7 @@ public class JsonRowDataDeserializationSchema implements DeserializationSchema<R
 		this.failOnMissingField = failOnMissingField;
 		this.ignoreParseErrors = ignoreParseErrors;
 		this.runtimeConverter = new JsonToRowDataConverters(failOnMissingField, ignoreParseErrors, timestampFormat)
-			.createRowConverter(checkNotNull(rowType));
+			.createConverter(checkNotNull(rowType));
 		this.timestampFormat = timestampFormat;
 		boolean hasDecimalType = LogicalTypeChecks.hasNested(rowType, t -> t instanceof DecimalType);
 		if (hasDecimalType) {
diff --git a/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonToRowDataConverters.java b/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonToRowDataConverters.java
index 25df3df..65feec3 100644
--- a/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonToRowDataConverters.java
+++ b/flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/JsonToRowDataConverters.java
@@ -106,7 +106,7 @@ public class JsonToRowDataConverters implements Serializable {
 	/**
 	 * Creates a runtime converter which is null safe.
 	 */
-	private JsonToRowDataConverter createConverter(LogicalType type) {
+	public JsonToRowDataConverter createConverter(LogicalType type) {
 		return wrapIntoNullableConverter(createNotNullConverter(type));
 	}
 
@@ -368,7 +368,7 @@ public class JsonToRowDataConverters implements Serializable {
 	private JsonToRowDataConverter wrapIntoNullableConverter(
 		JsonToRowDataConverter converter) {
 		return jsonNode -> {
-			if (jsonNode == null || jsonNode.isNull()) {
+			if (jsonNode == null || jsonNode.isNull() || jsonNode.isMissingNode()) {
 				return null;
 			}
 			try {
diff --git a/flink-formats/flink-json/src/test/java/org/apache/flink/formats/json/JsonRowDataSerDeSchemaTest.java b/flink-formats/flink-json/src/test/java/org/apache/flink/formats/json/JsonRowDataSerDeSchemaTest.java
index d324e85..b49326b 100644
--- a/flink-formats/flink-json/src/test/java/org/apache/flink/formats/json/JsonRowDataSerDeSchemaTest.java
+++ b/flink-formats/flink-json/src/test/java/org/apache/flink/formats/json/JsonRowDataSerDeSchemaTest.java
@@ -351,6 +351,17 @@ public class JsonRowDataSerDeSchemaTest {
 
 	@Test
 	public void testDeserializationMissingNode() throws Exception {
+		DataType dataType = ROW(FIELD("name", STRING()));
+		RowType schema = (RowType) dataType.getLogicalType();
+
+		JsonRowDataDeserializationSchema deserializationSchema = new JsonRowDataDeserializationSchema(
+			schema, InternalTypeInfo.of(schema), true, false, TimestampFormat.ISO_8601);
+		RowData rowData = deserializationSchema.deserialize("".getBytes());
+		assertEquals(null, rowData);
+	}
+
+	@Test
+	public void testDeserializationMissingField() throws Exception {
 		ObjectMapper objectMapper = new ObjectMapper();
 
 		// Root