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 asciidoc in the repository: https://github.com/apache/camel/blob/master/README.md https://github.com/apache/camel/blob/master/components/readme.adoc
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> |
