Search code examples
springspring-integrationjsonpathspring-el

Parse JSON using Spring SPEL


Can someone tell me why this does not work:

@Test
public void should_parse_json() {
    Expression expression = new SpelExpressionParser().parseExpression("#jsonPath(get('JsonData'), '$.someData')");

    Map<String, Object> data = new HashMap<>();
    data.put("JsonData", "{\"someData\": 100}");

    StandardEvaluationContext context = new StandardEvaluationContext(data);
    context.addPropertyAccessor(new JsonPropertyAccessor());

    assertThat(expression.getValue(context, Object.class)).isEqualTo(100);
}

I get error "org.springframework.expression.spel.SpelEvaluationException: EL1006E: Function 'jsonPath' could not be found"

And I have following jar in classpath:

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
    </dependency>

The SPEL documentation did not help me.


Solution

  • Such a #jsonPath() SpEL function is a part of Spring Integration infrastructure: https://docs.spring.io/spring-integration/docs/current/reference/html/spel.html#spel-functions.

    It's not going to work with the plain Spring and only SpEL.

    However I see that you use a JsonPropertyAccessor. This one indeed a part of Spring Integration and you definitely have that in your classpath.

    From here I think you just miss to register a SpEL function into the StandardEvaluationContext: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#expressions-ref-functions

    context.registerFunction("jsonPath", BeanUtils.resolveSignature("evaluate", JsonPathUtils.class));