Patr
Patr

Reputation: 752

How can I use JSONata in Java?

JSONata is an expression language designed to query and transform JSON data structures.

I find that current implementations of JSONata are in Javascript only. (https://github.com/jsonata-js/jsonata)

I want to use JSONata in my Java code. It'll make life much easier to manipulate JSON documents in Java.

A possible way could be to use the standard Java classes under javax.script package to interact with the Javascript-based JSONata implementation.

Has anyone already done this? Is there any sample code to demonstrate how this can be achieved?

Has anyone implemented other mechanisms of using JSONata in Java?

Upvotes: 7

Views: 5950

Answers (4)

aeberhart
aeberhart

Reputation: 899

We just published jsonata-java (https://github.com/dashjoin/jsonata-java) a 1:1 Java port of the jsonata-js reference that stays as close to the original source structure as possible:

This section in the README explains the design decisions that allowed porting the original JavaScript to Java 1:1.

Upvotes: 2

wnm3
wnm3

Reputation: 421

I have just posted a Java implementation of JSONata called JSONata4Java.

maven central:

JSONata4Java jar files are located here in Maven Central: https://search.maven.org/search?q=g:com.ibm.jsonata4java pom.xml dependency

<dependency>
 <groupId>com.ibm.jsonata4java</groupId>
 <artifactId>JSONata4Java</artifactId>
 <version>1.0.0</version>
</dependency>

github:

The Java port of jsonata project named JSONata4Java has been posted here: https://github.com/IBM/JSONata4Java

If you would like to contribute, please print and sign the appropriate JSONata4Java cla document and mail it to me:

IBM Corporation
c/o Nathaniel Mills
16 Deer Hill Ln.
Coventry, CT, 06238, US
Attn: OSS CLA Processing

Thanks in advance.

Upvotes: 7

btiernay
btiernay

Reputation: 8129

You can use the JSONata-Java project:

https://github.com/cow-co/jsonata-java

A Java port of the original (JavaScript) interpreter for the JSONata JSON query and transformation language.

Upvotes: 0

Andrew Coleman
Andrew Coleman

Reputation: 1559

The following snippet shows how you could invoke the JSONata processor from Java using the embedded JavaScript engine...

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
Invocable inv = (Invocable) engine;
FileReader jsonata = new FileReader("jsonata.js");

// load the JSONata processor
engine.eval(jsonata);

// read and JSON.parse the input data
byte[] sample = Files.readAllBytes(Paths.get("sample.json"));
engine.put("input", new String(sample));
Object inputjson = engine.eval("JSON.parse(input);");

// query the data
String expression = "$sum(Account.Order.Product.(Price * Quantity))";  // JSONata expression
Object expr = inv.invokeFunction("jsonata", expression);
Object resultjson = inv.invokeMethod(expr, "evaluate", inputjson);

// JSON.stringify the result
engine.put("resultjson", resultjson);
Object result = engine.eval("JSON.stringify(resultjson);");
System.out.println(result);

In this example, the jsonata.js file has been pulled down from the JSONata GitHub repo as well as the 'Invoice' sample code from try.jsonata.org.

Extra code would be needed to handle errors, but this gives the general idea.

Upvotes: 10

Related Questions