This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new a883172591d2 CAMEL-23160: camel-core - Add type converter for
camel-util-json (#21904)
a883172591d2 is described below
commit a883172591d271409d74e2b0981fb21558d5a3ee
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Mar 10 12:35:00 2026 +0100
CAMEL-23160: camel-core - Add type converter for camel-util-json (#21904)
---
.../camel/impl/engine/DefaultClassResolver.java | 11 ++++++
.../camel/converter/json/JsonConverterTest.java | 42 ++++++++++++++++++++++
.../apache/camel/language/simple/SimpleTest.java | 36 +++++++++++++++++++
.../stream/CamelSupportBulkConverterLoader.java | 11 +++++-
.../apache/camel/converter/json/JsonConverter.java | 6 ++++
5 files changed, 105 insertions(+), 1 deletion(-)
diff --git
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
index 385294c5d235..23df173ffed6 100644
---
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
+++
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultClassResolver.java
@@ -21,6 +21,7 @@ import java.net.URL;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashSet;
+import java.util.Map;
import java.util.Set;
import org.apache.camel.CamelContext;
@@ -34,6 +35,12 @@ import org.apache.camel.util.ObjectHelper;
*/
public class DefaultClassResolver implements ClassResolver, CamelContextAware {
+ // shorthand for known camel types (so you do not have to remember to FQN)
+ private static final Map<String, String> KNOWN_CAMEL_TYPES = Map.of(
+ "JsonObject", "org.apache.camel.util.json.JsonObject",
+ "JsonArray", "org.apache.camel.util.json.JsonArray",
+ "Json", "org.apache.camel.util.json.Jsonable");
+
private Set<ClassLoader> classLoaders;
private CamelContext camelContext;
@@ -100,6 +107,10 @@ public class DefaultClassResolver implements
ClassResolver, CamelContextAware {
// fallback and use application context class loader
answer = loadClass(name, getApplicationContextClassLoader());
}
+ if (answer == null && KNOWN_CAMEL_TYPES.containsKey(name)) {
+ // try alias
+ answer = resolveClass(KNOWN_CAMEL_TYPES.get(name));
+ }
return answer;
}
diff --git
a/core/camel-core/src/test/java/org/apache/camel/converter/json/JsonConverterTest.java
b/core/camel-core/src/test/java/org/apache/camel/converter/json/JsonConverterTest.java
index 6bc743e268b9..627b18a2036a 100644
---
a/core/camel-core/src/test/java/org/apache/camel/converter/json/JsonConverterTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/converter/json/JsonConverterTest.java
@@ -17,6 +17,9 @@
package org.apache.camel.converter.json;
import org.apache.camel.ContextTestSupport;
+import org.apache.camel.model.ConvertBodyDefinition;
+import org.apache.camel.model.FromDefinition;
+import org.apache.camel.model.RouteDefinition;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
import org.junit.jupiter.api.Assertions;
@@ -96,4 +99,43 @@ public class JsonConverterTest extends ContextTestSupport {
Assertions.assertEquals(1949, b2.getInteger("year"));
}
+ @Test
+ public void testConvertObjectShorthand() throws Exception {
+ RouteDefinition rd = new RouteDefinition();
+ rd.setInput(new FromDefinition("direct:start"));
+ rd.addOutput(new ConvertBodyDefinition("JsonObject")); // use
shorthand name instead of full FQN
+ context.addRouteDefinition(rd);
+
+ JsonObject jo = (JsonObject) template.requestBody("direct:start",
BOOKS);
+ Assertions.assertNotNull(jo);
+
+ JsonArray arr = jo.getJsonObject("library").getJsonArray("book");
+ Assertions.assertEquals(2, arr.size());
+ JsonObject b1 = arr.getJsonObject(0);
+ JsonObject b2 = arr.getJsonObject(1);
+ Assertions.assertEquals("No Title", b1.getString("title"));
+ Assertions.assertEquals(1925, b1.getInteger("year"));
+ Assertions.assertEquals("1984", b2.getString("title"));
+ Assertions.assertEquals(1949, b2.getInteger("year"));
+ }
+
+ @Test
+ public void testConvertArrayShorthand() throws Exception {
+ RouteDefinition rd = new RouteDefinition();
+ rd.setInput(new FromDefinition("direct:start"));
+ rd.addOutput(new ConvertBodyDefinition("JsonArray")); // use shorthand
name instead of full FQN
+ context.addRouteDefinition(rd);
+
+ JsonArray arr = (JsonArray) template.requestBody("direct:start",
BOOKS_ARR);
+ Assertions.assertNotNull(arr);
+
+ Assertions.assertEquals(2, arr.size());
+ JsonObject b1 = arr.getJsonObject(0);
+ JsonObject b2 = arr.getJsonObject(1);
+ Assertions.assertEquals("No Title", b1.getString("title"));
+ Assertions.assertEquals(1925, b1.getInteger("year"));
+ Assertions.assertEquals("1984", b2.getString("title"));
+ Assertions.assertEquals(1949, b2.getInteger("year"));
+ }
+
}
diff --git
a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
index de65f6475292..042579a3dfa7 100644
---
a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java
@@ -60,6 +60,8 @@ import org.apache.camel.support.ExchangeHelper;
import org.apache.camel.support.LanguageHelper;
import org.apache.camel.util.InetAddressUtil;
import org.apache.camel.util.StringHelper;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
import org.apache.camel.util.json.Jsoner;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.ResourceLock;
@@ -2712,6 +2714,40 @@ public class SimpleTest extends LanguageTestSupport {
assertEquals(Boolean.TRUE, s);
}
+ @Test
+ public void testConvertToCamelJson() {
+ exchange.getMessage().setBody("{ \"name\": \"Scott\", \"age\": 44 }");
+
+ Expression expression =
context.resolveLanguage("simple").createExpression("${convertTo(JsonObject)}");
+ JsonObject jo = expression.evaluate(exchange, JsonObject.class);
+ assertNotNull(jo);
+ assertEquals("Scott", jo.getString("name"));
+ assertEquals(44, jo.getInteger("age"));
+
+ // shorthand for either JSonObject or JSonArray
+ expression =
context.resolveLanguage("simple").createExpression("${convertTo(Json)}");
+ jo = expression.evaluate(exchange, JsonObject.class);
+ assertNotNull(jo);
+ assertEquals("Scott", jo.getString("name"));
+ assertEquals(44, jo.getInteger("age"));
+
+ exchange.getMessage().setBody("[ { \"name\": \"Scott\", \"age\": 44 },
{ \"name\": \"Jack\", \"age\": 23 } ]");
+ expression =
context.resolveLanguage("simple").createExpression("${convertTo(JsonArray)}");
+ JsonArray arr = expression.evaluate(exchange, JsonArray.class);
+ assertNotNull(arr);
+ assertEquals(2, arr.size());
+ assertEquals("Scott", arr.getJsonObject(0).getString("name"));
+ assertEquals(44, arr.getJsonObject(0).getInteger("age"));
+ assertEquals("Jack", arr.getJsonObject(1).getString("name"));
+ assertEquals(23, arr.getJsonObject(1).getInteger("age"));
+
+ // shorthand for either JSonObject or JSonArray
+ expression =
context.resolveLanguage("simple").createExpression("${convertTo(Json)}");
+ arr = expression.evaluate(exchange, JsonArray.class);
+ assertNotNull(arr);
+ assertEquals(2, arr.size());
+ }
+
@Test
public void testConvertToOGNL() {
exchange.getIn().setBody(new OrderLine(123, "Camel in Action"));
diff --git
a/core/camel-support/src/generated/java/org/apache/camel/converter/stream/CamelSupportBulkConverterLoader.java
b/core/camel-support/src/generated/java/org/apache/camel/converter/stream/CamelSupportBulkConverterLoader.java
index 7a7a1177fc87..ee06fd855ade 100644
---
a/core/camel-support/src/generated/java/org/apache/camel/converter/stream/CamelSupportBulkConverterLoader.java
+++
b/core/camel-support/src/generated/java/org/apache/camel/converter/stream/CamelSupportBulkConverterLoader.java
@@ -41,7 +41,7 @@ public final class CamelSupportBulkConverterLoader implements
TypeConverterLoade
@Override
public int size() {
- return 8;
+ return 9;
}
@Override
@@ -92,6 +92,10 @@ public final class CamelSupportBulkConverterLoader
implements TypeConverterLoade
if (value instanceof java.lang.String) {
return
org.apache.camel.converter.json.JsonConverter.convertToJsonObject((java.lang.String)
value, exchange);
}
+ } else if (to == org.apache.camel.util.json.Jsonable.class) {
+ if (value instanceof java.lang.String) {
+ return
org.apache.camel.converter.json.JsonConverter.convertToJson((java.lang.String)
value, exchange);
+ }
}
return null;
}
@@ -105,6 +109,7 @@ public final class CamelSupportBulkConverterLoader
implements TypeConverterLoade
registry.addConverter(new TypeConvertible<>(java.io.Reader.class,
org.apache.camel.StreamCache.class), this);
registry.addConverter(new TypeConvertible<>(java.lang.String.class,
org.apache.camel.util.json.JsonArray.class), this);
registry.addConverter(new TypeConvertible<>(java.lang.String.class,
org.apache.camel.util.json.JsonObject.class), this);
+ registry.addConverter(new TypeConvertible<>(java.lang.String.class,
org.apache.camel.util.json.Jsonable.class), this);
}
public TypeConverter lookup(Class<?> to, Class<?> from) {
@@ -137,6 +142,10 @@ public final class CamelSupportBulkConverterLoader
implements TypeConverterLoade
if (from == java.lang.String.class) {
return this;
}
+ } else if (to == org.apache.camel.util.json.Jsonable.class) {
+ if (from == java.lang.String.class) {
+ return this;
+ }
}
return null;
}
diff --git
a/core/camel-support/src/main/java/org/apache/camel/converter/json/JsonConverter.java
b/core/camel-support/src/main/java/org/apache/camel/converter/json/JsonConverter.java
index 15b4d75cd1f3..d522a5f791e7 100644
---
a/core/camel-support/src/main/java/org/apache/camel/converter/json/JsonConverter.java
+++
b/core/camel-support/src/main/java/org/apache/camel/converter/json/JsonConverter.java
@@ -20,6 +20,7 @@ import org.apache.camel.Converter;
import org.apache.camel.Exchange;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsonable;
import org.apache.camel.util.json.Jsoner;
/**
@@ -44,4 +45,9 @@ public final class JsonConverter {
return (JsonArray) Jsoner.deserialize(json);
}
+ @Converter(order = 3)
+ public static Jsonable convertToJson(String json, Exchange exchange)
throws Exception {
+ return (Jsonable) Jsoner.deserialize(json);
+ }
+
}