...
Camel supports JSonPath to allow using Expression or Predicate on json JSON messages.
Code Block |
---|
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")
|
...
If you prefer to configure your routes in your Spring XML file then you can use JSonPath expressions as follows:
Code Block | ||
---|---|---|
| ||
<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>
|
...
See the JSonPath project page for further examples.
Suppress exceptions
Available as of Camel 2.16
By default jsonpath
will throw an exception if the JSON payload does not have a valid path accordingly to the configured jsonpath
expression. In some use-cases you may want to ignore this in case the JSON payload contains optional data. To ignore exceptions set the option suppressExceptions=true
as shown below:
Code Block | ||
---|---|---|
| ||
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:
Code Block | ||||
---|---|---|---|---|
| ||||
<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 @JsonPath
annotation.
Inline Simple expressions
Available as of Camel 2.18
It's now possible to in-lined Simple language expressions in the JSonPath expression using the simple syntax ${xxx}
.
Example:
Code Block |
---|
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.
Code Block | ||||
---|---|---|---|---|
| ||||
<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 allowSimple=false
as shown:
Code Block |
---|
// java dsl
.when().jsonpath("$.store.book[?(@.price < 10)]", false, false)
// xml dsl
<jsonpath allowSimple="false">$.store.book[?(@.price < 10)]</jsonpath> |
JSonPath injection
You 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.
For exampleExample:
Code Block | ||
---|---|---|
| ||
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 Detection
Since Camel version 2.16, the encoding of the JSON document is detected automatically, if the document is encoded in Unicode (UTF-8
, UTF-16LE
, UTF-16BE
, UTF-32LE
, UTF-32BE
) as specified in RFC-4627
. If the encoding is a non-Unicode encoding, you can either make sure that you enter the document in String
format to the JSonPath component or you can specify the encoding in the header CamelJsonPathJsonEncoding
(JsonpathConstants.HEADER_JSON_ENCODING
).
Dependencies
To use JSonPath in your camel routes you need to add the a dependency on on camel-jsonpath
which implements the JSonPath language.
If you use maven you could just add the following to your pom.xml
, substituting the version number for the latest & greatest release (see the download page for the latest versions).
Code Block | ||||
---|---|---|---|---|
| ||||
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jsonpath</artifactId>
<version>x.x.x</version>
</dependency>
|