...
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> |
...
Available as of Camel 2.16
By default default jsonpath
will throw an exception if the json JSON payload does not have a valid path accordingly to the configured configured jsonpath
expression. In some use-cases you may want to ignore this in case the json JSON payload contains optional data. Therefore you can To ignore exceptions set the option option suppressExceptions
to =true
to ignore this 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"); |
...
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).
...