Categories
JavaScript Answers

What is JSON Equivalent of XQuery/XPath?

Spread the love

If we’re manipulating XML, we can use the XQuery or XPath query languages to find the elements we want in the XML code.

In JSON, there’s no such query language built-in natively in any runtime environment, but there’re many libraries that let us do the same thing.

In this article, we’ll look at the equivalents of XQuery or XPath with JSON.

JSPath

One library that we can use to query JSON objects is the JSPath library.

To use it, we can run:

npm i jspath

to install it.

Then we can use it to query JSON by writing:

import JSPath from "jspath";

const results = JSPath.apply(
  '.automobiles{.maker === "Honda" && .year > 2009}.model',
  {
    automobiles: [
      { maker: "Nissan", model: "Teana", year: 2000 },
      { maker: "Honda", model: "Jazz", year: 2023 },
      { maker: "Honda", model: "Civic", year: 2007 },
      { maker: "Toyota", model: "Yaris", year: 2008 },
      { maker: "Honda", model: "Accord", year: 2011 }
    ],
    motorcycles: [{ maker: "Honda", model: "ST1300", year: 2012 }]
  }
);

console.log(results);

We call JSPath.apply to query the object we have in the 2nd argument.

The first argument is a string with the query.

We search for items in the automobiles array with maker equals 'Honda' and year bigger than 2009.

And we get the model property of each object.

Therefore, result is:

["Jazz", "Accord"]

It also supports wildcard queries with * .

For instance, we can write:

import JSPath from "jspath";

const results = JSPath.apply(
  '.automobiles{.maker === "Honda" && .year > 2009}.*',
  {
    automobiles: [
      { maker: "Nissan", model: "Teana", year: 2000 },
      { maker: "Honda", model: "Jazz", year: 2023 },
      { maker: "Honda", model: "Civic", year: 2007 },
      { maker: "Toyota", model: "Yaris", year: 2008 },
      { maker: "Honda", model: "Accord", year: 2011 }
    ],
    motorcycles: [{ maker: "Honda", model: "ST1300", year: 2012 }]
  }
);

console.log(results);

Then result is:

["Honda", "Jazz", 2023, "Honda", "Accord", 2011]

We get all the property values of matched result objects with the * operator.

JSONPath

Another library that we can use to query JSON objects is to use the JSONPath library.

To install it, we run:

npm i jsonpath

Then we can use it by writing:

const jp = require("jsonpath");
const persons = [
  { name: "James", age: 36 },
  { name: "Mary", age: 34 },
  { name: "Jane", age: 35 },
  { name: "Bob", age: 28 }
];

const names = jp.query(persons, "$..name");
console.log(names);

We call jp.query to get the name property from each entry of the persons array with the “$..name” query.

$ means the root object.

.. means we find the properties recursively.

Therefore, we have:

["James", "Mary", "Jane", "Bob"]

as a result of names .

We can also query for objects that meets a given condition by writing:

const jp = require("jsonpath");
const obj = {
  persons: [
    { name: "James", age: 36 },
    { name: "Mary", age: 34 },
    { name: "Jane", age: 35 },
    { name: "Bob", age: 28 }
  ]
};

const names = jp.query(obj, "$..persons[?(@.age>30)]");
console.log(names);

We call jp.query to find objects in the persons array property with age bigger than 30.

So we get:

[
  {
    "name": "James",
    "age": 36
  },
  {
    "name": "Mary",
    "age": 34
  },
  {
    "name": "Jane",
    "age": 35
  }
]

as the value of names .

Conclusion

We can use the JSPath and JSONPath libraries to query for items in JavaScript objects.

By John Au-Yeung

Web developer specializing in React, Vue, and front end development.

Leave a Reply

Your email address will not be published. Required fields are marked *