...
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
Its It's now possible to inlined in-lined Simple language expressions in the JSonPath expression using the simple syntax ${xxx}
. An example is shown below
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 inlined in-lined is the headers with the cheap and average values to be used.
...
You can turn off support for inlined in-lined simple expression by setting the option allowSimple
to =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> |
...
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 } } |
...
Since Camel version 2.16, the encoding of the JSON document is detected automatically, if the document is encoded in unicode Unicode (UTF-8
, UTF-16LE
, UTF-16BE
, UTF-32LE
, UTF-32BE
) as specified in RFC RFC-4627
. If the encoding is a non-unicode Unicode encoding, you can either make sure that you enter the document in in String
format to the JSONPath 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).
...