Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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
langxml
  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="direct:start"/>
      <choice>
        <when>
          <jsonpath>$.store.book[?(@.price &lt; 10)]</jsonpath>
          <to uri="mock:cheap"/>
        </when>
        <when>
          <jsonpath>$.store.book[?(@.price &lt; 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
languagejava
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
languagejava
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).

...