Skip to content

TotalTechGeek/json-power-query

Folders and files

NameName
Last commit message
Last commit date

Latest commit

a5f94ac · Nov 26, 2024

History

37 Commits
Apr 18, 2023
Oct 25, 2021
Oct 30, 2021
Oct 26, 2021
May 9, 2021
Nov 2, 2021
Nov 2, 2021
Oct 25, 2021
Oct 25, 2021
Nov 26, 2024
Oct 25, 2021
Oct 25, 2021
Oct 25, 2021
Aug 19, 2021
Nov 26, 2024

Repository files navigation

JSON Power Query

This is a simple JSON querying mechanism similar to jsonpath. This mechanism allows for ultra-fast queries by "compiling" your queries into evaluated JavaScript.

At the same time, the mechanism uses json-logic-engine to power its filtering, to prevent the unsafe evaluation of any JavaScript code.

Examples

Given the following:

const request = {
    body: {
        name: "John Doe",
        age: 35,
        friends: [
            {
                name: "Steve",
                age: 23
            },
            {
                name: "Bob",
                age: 65
            },
            {
                name: "Erik",
                age: 33
            }
        ]
    },
    params: {
        id: 101
    }
}

Requesting a single property:

const { queryBuilder, objectQueryBuilder } = require('json-query-engine')
const nameGetter = queryBuilder('$.body.name')
console.log(nameGetter(request)) // prints: John Doe

Requesting nested properties from an array:

const friendsNames = queryBuilder('$.body.friends.*.name')
console.log(JSON.stringify(friendsNames(request))) // prints: ["Steve", "Bob", "Erik"]

Requesting filtered values from an array:

// the filtering uses json-logic-engine, and uses truthiness.
const olderFriendNames = queryBuilder('$.body.friends.*{ ">": [{ "var": "age" }, 30] }.name')
console.log(JSON.stringify(olderFriendNames(request))) // prints: ["Bob", "Erik"]

Alternatively, you can use the more normal looking JSONPath Syntax:

const olderFriendNames = queryBuilder('$.body.friends.[?(@.age > 30)].name')
console.log(JSON.stringify(olderFriendNames(request))) // prints: ["Bob", "Erik"]

You can also build a function that transforms object shapes into different shapes:

const f = objectQueryBuilder({
    name: '$.body.name',
    friends: '$.body.friends.*.name',
    id: '$.params.id',
    meta: {
        friendAges: '$.body.friends.*.age'
    }
})

const y = f(request)  
/* Generates:
 * { 
 *     "name": "John Doe", 
 *     "friends": [ 
 *         "Steve", 
 *         "Bob", 
 *         "Erik" 
 *     ], 
 *     "id": 101, 
 *     "meta": { 
 *         "friendAges": [ 
 *             23, 
 *             65, 
 *             33 
 *         ] 
 *     } 
 * }
 */

About

A simpler version of a json querying mechanism.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published