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