This is an automated email from the ASF dual-hosted git repository.
pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new e39d991314 NIFI-14504 Fixed Record Field Conversion from Array to
String
e39d991314 is described below
commit e39d991314079ce8c7cb0076459ec0aefc2ee103
Author: exceptionfactory <[email protected]>
AuthorDate: Tue Apr 29 21:27:44 2025 -0500
NIFI-14504 Fixed Record Field Conversion from Array to String
- Updated Object Array handling to support types other than byte primitives
Signed-off-by: Pierre Villard <[email protected]>
This closes #9906.
---
.../record/field/ObjectStringFieldConverter.java | 18 +++++++++-----
.../field/ObjectStringFieldConverterTest.java | 19 +++++++++++---
.../nifi/json/TestJsonTreeRowRecordReader.java | 29 ++++++++++++++++++++++
3 files changed, 57 insertions(+), 9 deletions(-)
diff --git
a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverter.java
b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverter.java
index 74a2f83c78..65b9c92d34 100644
---
a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverter.java
+++
b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverter.java
@@ -27,6 +27,7 @@ import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
import java.util.Date;
import java.util.Optional;
@@ -98,14 +99,19 @@ class ObjectStringFieldConverter implements
FieldConverter<Object, String> {
}
case Object[] objectArray -> {
if (objectArray.length > 0) {
- final byte[] converted = new byte[objectArray.length];
- for (int i = 0; i < objectArray.length; i++) {
- converted[i] = (byte) objectArray[i];
+ final Object firstElement = objectArray[0];
+
+ if (firstElement instanceof Byte) {
+ final byte[] converted = new byte[objectArray.length];
+ for (int i = 0; i < objectArray.length; i++) {
+ converted[i] = (byte) objectArray[i];
+ }
+ return new String(converted, StandardCharsets.UTF_8);
+ } else {
+ return Arrays.toString(objectArray);
}
- return new String(converted, StandardCharsets.UTF_8);
} else {
- // Handle an empty array as an empty string
- return "";
+ return Arrays.toString(objectArray);
}
}
default -> {
diff --git
a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverterTest.java
b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverterTest.java
index 29f6d46e6a..e73cc490f4 100644
---
a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverterTest.java
+++
b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverterTest.java
@@ -46,7 +46,11 @@ class ObjectStringFieldConverterTest {
private static final String DATE_TIME_ZONE_OFFSET_PATTERN = "yyyy-MM-dd
HH:mm:ssZZZZZ";
- private static final String EMPTY_STRING = "";
+ private static final String EMPTY_ARRAY_STRING = "[]";
+
+ private static final String ARRAY_STRING_ELEMENT =
String.class.getSimpleName();
+
+ private static final String ARRAY_STRING = "[String, String, String]";
@Test
void testConvertFieldNull() {
@@ -124,7 +128,7 @@ class ObjectStringFieldConverterTest {
}
@Test
- void testConvertFieldObjectArray() {
+ void testConvertFieldObjectArrayOfBytes() {
final String expected = String.class.getSimpleName();
final byte[] bytes = expected.getBytes(StandardCharsets.UTF_8);
@@ -137,12 +141,21 @@ class ObjectStringFieldConverterTest {
assertEquals(expected, string);
}
+ @Test
+ void testConvertFieldObjectArrayOfStrings() {
+ final Object[] objectArray = new Object[]{ARRAY_STRING_ELEMENT,
ARRAY_STRING_ELEMENT, ARRAY_STRING_ELEMENT};
+
+ final String string = CONVERTER.convertField(objectArray,
Optional.empty(), FIELD_NAME);
+
+ assertEquals(ARRAY_STRING, string);
+ }
+
@Test
void testConvertFieldObjectArrayEmpty() {
final Object[] objectArray = new Object[0];
final String string = CONVERTER.convertField(objectArray,
Optional.empty(), FIELD_NAME);
- assertEquals(EMPTY_STRING, string);
+ assertEquals(EMPTY_ARRAY_STRING, string);
}
private String getDateTimeZoneOffset() {
diff --git
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
index cb2ad449ae..92c4d3d0d6 100644
---
a/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
+++
b/nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestJsonTreeRowRecordReader.java
@@ -759,6 +759,35 @@ class TestJsonTreeRowRecordReader {
assertEquals(List.of("1", "2", "3", "4"), ids);
}
+ @Test
+ public void testArrayOfStringsToString() throws Exception {
+ final String inputJson = """
+ [{
+ "labels": [
+ "first", "second", "third"
+ ]
+ }]""";
+
+ final String labelsFieldName = "labels";
+ final RecordSchema recordSchema = new SimpleRecordSchema(List.of(
+ new RecordField(labelsFieldName,
RecordFieldType.STRING.getDataType())
+ ));
+
+ final StringBuilder labelsRead = new StringBuilder();
+ try (final InputStream in = new
ByteArrayInputStream(inputJson.getBytes(StandardCharsets.UTF_8));
+ final JsonTreeRowRecordReader reader =
createJsonTreeRowRecordReader(in, recordSchema, dateFormat, timeFormat,
timestampFormat,
+ StartingFieldStrategy.ROOT_NODE, null,
SchemaApplicationStrategy.SELECTED_PART, null, false, null)
+ ) {
+ final Record record = reader.nextRecord();
+ assertNotNull(record, "Record not found");
+
+ final String labels = record.getAsString(labelsFieldName);
+ labelsRead.append(labels);
+ }
+
+ assertEquals("[first, second, third]", labelsRead.toString());
+ }
+
@Test
public void testMultipleInputRecordsWithStartingFieldSingleObject() throws
Exception {
final String inputJson = """