Since we're on a major migration process of this website, some component documents here are out of sync right now. In the meantime you may want to look at the early version of the new website
https://camel.apache.org/staging/
We would very much like to receive any feedback on the new site, please join the discussion on the Camel user mailing list.
JSonPathAvailable as of Camel 2.13 Camel supports JSonPath to allow using Expression or Predicate on JSON messages. from("queue:books.new") .choice() .when().jsonpath("$.store.book[?(@.price < 10)]") .to("jms:queue:book.cheap") .when().jsonpath("$.store.book[?(@.price < 30)]") .to("jms:queue:book.average") .otherwise() .to("jms:queue:book.expensive") Using XML configurationIf you prefer to configure your routes in your Spring XML file then you can use JSonPath expressions as follows: <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start"/> <choice> <when> <jsonpath>$.store.book[?(@.price < 10)]</jsonpath> <to uri="mock:cheap"/> </when> <when> <jsonpath>$.store.book[?(@.price < 30)]</jsonpath> <to uri="mock:average"/> </when> <otherwise> <to uri="mock:expensive"/> </otherwise> </choice> </route> </camelContext> SyntaxSee the JSonPath project page for further examples. Suppress exceptionsAvailable as of Camel 2.16 By default from("direct:start") .choice() // use true to suppress exceptions .when().jsonpath("person.middlename", true) .to("mock:middle") .otherwise() .to("mock:other"); And in XML DSL: <route> <from uri="direct:start"/> <choice> <when> <jsonpath suppressExceptions="true">person.middlename</jsonpath> <to uri="mock:middle"/> </when> <otherwise> <to uri="mock:other"/> </otherwise> </choice> </route>
This option is also available on the Inline Simple expressionsAvailable as of Camel 2.18 It's now possible to in-lined Simple language expressions in the JSonPath expression using the simple syntax Example: from("direct:start") .choice() .when().jsonpath("$.store.book[?(@.price < ${header.cheap})]") .to("mock:cheap") .when().jsonpath("$.store.book[?(@.price < ${header.average})]") .to("mock:average") .otherwise() .to("mock:expensive"); In this example the Simple expression in-lined is the headers with the cheap and average values to be used. <route> <from uri="direct:start"/> <choice> <when> <jsonpath>$.store.book[?(@.price < ${header.cheap})]</jsonpath> <to uri="mock:cheap"/> </when> <when> <jsonpath>$.store.book[?(@.price < ${header.average})]</jsonpath> <to uri="mock:average"/> </when> <otherwise> <to uri="mock:expensive"/> </otherwise> </choice> </route> You can turn off support for in-lined simple expression by setting the option
// java dsl .when().jsonpath("$.store.book[?(@.price < 10)]", false, false) // xml dsl <jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath>
JSonPath injectionYou can use Bean Integration to invoke a method on a bean and use various languages such as JSonPath to extract a value from the message and bind it to a method parameter. Example: public class Foo { @Consume(uri = "activemq:queue:books.new") public void doSomething(@JsonPath("$.store.book[*].author") String author, @Body String json) { // process the inbound message here } } Encoding DetectionSince Camel version 2.16, the encoding of the JSON document is detected automatically, if the document is encoded in Unicode ( DependenciesTo use JSonPath in your camel routes you need to add the a dependency on If you use maven you could just add the following to your <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jsonpath</artifactId> <version>x.x.x</version> </dependency> |