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 = """

Reply via email to