jsoncode

JSON with conditional statements, switches, spread/combine and other operators.

Usage no npm install needed!

<script type="module">
  import jsoncode from 'https://cdn.skypack.dev/jsoncode';
</script>

README

JSONCode

JSON with conditional statements, switches, spread/combine and other operators.

Example

"petShop.json"

{
    "Animals": {
        "cat [IF size = 'little' & carnivorous]": {
            "type": "mammal",
            "worth [BY target]": {
                "sellOne": 100,
                "sellInBulk" : 80
            }
        },
        "dog [IF size = 'middle' & carnivorous]": {
            "type": "mammal",
            "worth [BY target]": {
                "sellOne": 130,
                "sellInBulk" : 110
            }
        },
        "chinchilla [IF size = 'little' & !carnivorous]": {
            "type": "mammal",
            "worth [BY target]": {
                "sellOne": 50,
                "sellInBulk" : 45
            }
        }
    },
    
    "Animals food": { 
        "In stock [BY city, type, carnivorous]": {
            "Washington" : {
                "mammal" : {
                    "#TRUE": "100 kg",
                    "#FALSE": "65 kg"
                },
                "insect" : {
                    "#TRUE": "20 kg",
                    "#FALSE": "5 kg"
                }
            },
            "New York" : {
                "mammal" : {
                    "#TRUE": "90 kg",
                    "#FALSE": "50 kg"
                },
                "insect" : {
                    "#TRUE": "15 kg",
                    "#FALSE": "3 kg"
                }
            }
        }
    }
}

"petShop.js"

import jsoncode from 'jsoncode';
import petShop from './petShop.json' /*[ assert { type: 'json' } ]*/ ;
 
const priceList = jsoncode(petShop['Animals'], {
    size: "little",
    carnivorous: true,
    target: "sellOne"
});
 
//Alternate using by JSON
const animalsFood = JSON.specify(petShop['Animals food'], {
    city: "New York",
    type: "mammal",
    carnivorous: true
});
 
//Output
const animalTypes = Object.keys(priceList);
for (let animalType of animalTypes) console.log(
    animalType, 
    priceList[animalType]
);
 
console.log('Animals food', animalsFood);

Result:

cat { type: 'mammal', worth: 100 }
Animals food { 'In stock': '90 kg' }

Manual

Logical and comparison operators

operator meaning example
& And [IF a & b]
| Or [IF a | b]
! Not [IF !a]
= Strictly equal to [IF a = 'str']
~ Equal to [IF a ~ 'str']
!= Not equal to [IF a != 'str']
> Greater than [IF a > 10]
< Less than [IF a < 10]
>= Greater than or equal to [IF a >= 10]
<= Less than or equal to [IF a <= 10]
E Is an element of (array) [IF 'str' E a]
C Is match (regEx) [IF 'str' C a]
!E Is not an element of (array) [IF 'str' !E a]
!C Is not match (regEx) [IF 'str' !C a]
Without operator Interp. as =, E, C depending on args type [IF 'str' a]

Existence operator [IF ]

If the condition is false, the node will be removed from the tree

const myJsonObject = {
    "Element 1 [IF myVariable > 0]" : "some content 1", 
    "Element 2 [IF myVariable > 5]" : "some content 2", 
    "Element 3 [IF myVariable > 10]" : "some content 3" 
};

const result = jsoncode(myJsonObject, {myVariable: 7});
console.log(result);

//{"Element 1": "some content 1", "Element 2": "some content 2"}

Switch operator [BY ]

This operator selects the value of a node by <string|boolean|regEx|array> variable

const myJsonObject = {
    "Selected value [BY mySelector]" : {
        "item 1" : "some content 1",
        "item 2" : "some content 2"
    }, 
};

const result = jsoncode(myJsonObject, {mySelector: 'item 2'});
console.log(result);
 
//{"Selected value": "some content 2"}

Default case

const myJsonObject = {
    "Selected value [BY mySelector]" : {
        "item 1" : "some content 1",
        "item 2" : "some content 2",
        "#DEFAULT" : "some content 3"
    }, 
};

const result = jsoncode(myJsonObject, {mySelector: 'item 5'});
console.log(result);
 
//{"Selected value": "some content 3"}

Boolean value

const myJsonObject = {
    "Selected value [BY mySelector]" : {
        "#TRUE"  : "some content 1",
        "#FALSE" : "some content 2"
    }, 
};

const result = jsoncode(myJsonObject, {mySelector: true});
console.log(result);
 
//{"Selected value": "some content 1"}

Several levels

const myJsonObject = {
    "Selected value [BY mySelector, mySubSelector]" : {
        "item 1" : {
            "subItem A": "some content 1 A",
            "subItem B": "some content 1 B"
        },
        "item 2" : {
            "subItem A": "some content 2 A",
            "subItem B": "some content 2 B"
        }
    }, 
};

const result = jsoncode(myJsonObject, {
    mySelector: 'item 2', 
    mySubSelector: 'subItem A'
});
console.log(result);
 
//{"Selected value" : "some content 2 A"}

Filter operator [*BY ]

This operator filters node content by <string|regEx|array> variable

const myJsonObject = {
    "Selected values [*BY mySelector]" : {
        "item 1" : "some content 1",
        "item 2" : "some content 2",
        "item 3" : "some content 3"
    }, 
};

const result1 = jsoncode(myJsonObject, {mySelector: /^(item 1|item 2)$/});
console.log(result1);

//{"Selected values": ["some content 1", "some content 2"]}

const result2 = jsoncode(myJsonObject, {mySelector: ['item 2', 'item 3']});
console.log(result2);

//{"Selected values": ["some content 2", "some content 3"]}

Object to array operator [AS ARRAY]

This operator converts an object with conditions into an array.

const myJsonObject = {
    "Its Array [AS ARRAY]" : {  
        "[ * ]"                : "some content 0",
        "[IF myVariable >  0]" : "some content 1", 
        "[IF myVariable >  5]" : "some content 2", 
        "[IF myVariable > 10]" : "some content 3" 
    }
};

const result = jsoncode(myJsonObject, {myVariable: 7});
console.log(result);

//{"Its Array": ["some content 0", "some content 1", "some content 2"]}

Spread and merge operators [...IF ], [...], [*...]

  • [...IF ]
    if the condition is false, the node will be removed from the tree, otherwise the content of the node will be added to the parent object.
  • [...]
    The content of the node will be added to the parent object.
  • [*...]
    The content of the node will be added to the node with same name if parent node is merged.
const myJsonObject = {
    "Its Object" : {
        "item1" : "some content 1", 
        "item2" : { 
            "subItem1": "some content 1", 
            "subItem2": "some content 2" 
        }, 
        "item3" : { 
            "subItem1": "some content 1", 
            "subItem2": "some content 2" 
        }, 
        "[...IF myVariable > 5]" : {
            "item2"        : { 
                "subItem2": "some content 2b", 
                "subItem3": "some content 3b" 
            }, 
            "item3 [*...]" : { 
                "subItem2": "some content 2b", 
                "subItem3": "some content 3b" 
            }, //Combine operator
        }
    },
    "Its Array [AS ARRAY]" : {
        "[...]"                  : ["some content 0a", "some content 0b"], 
        "[IF    myVariable > 0]" : "some content 1", 
        "[...IF myVariable > 5]" : ["some content 2", "some content 3"], 
        "[IF    myVariable > 6]" : ["some content 6", "some content 7"] 
    }
};

const result = jsoncode(myJsonObject, {myVariable: 7});
console.log(result);

/*
{
    "Its Object": {
        "item1" : "some content 1",
        "item2" : { 
            "subItem2": "some content 2b", 
            "subItem3": "some content 3b" 
        },
        "item3" : { 
            "subItem1": "some content 1", 
            "subItem2": "some content 2b", 
            "subItem3": "some content 3b"
        }
    }
    "Its Array": [
        "some content 0a", 
        "some content 0b", 
        "some content 1", 
        "some content 2", 
        "some content 3", 
        ["some content 6", "some content 7"]
    ],
}
*/

[...BY ]

This operator filters the content of the node by the <string|regEx|array> variable and places the selected elements into the parent node.

const myJsonObject = {
    "item1" : "some content 1", 
    "item2" : { "subItem1": "some content 1", "subItem2": "some content 2" }, 
    "item3" : { "subItem1": "some content 1", "subItem2": "some content 2" }, 
    "[...BY myVariable]" : {
        "variantA" : {
            "item2"        : { 
                "subItem2": "some content 2b", 
                "subItem3": "some content 3b" 
            }, 
            "item3 [*...]" : { 
                "subItem2": "some content 2b", 
                "subItem3": "some content 3b" 
            },
        },
        "variantB" : {
            "item2"        : { 
                "subItem2": "some content 2c", 
                "subItem3": "some content 3c" 
            }, 
            "item3 [*...]" : { 
                "subItem2": "some content 2c",
                 "subItem3": "some content 3c" 
            },
        }
    }
};

const result = jsoncode(myJsonObject, {myVariable: 'variantA'});
console.log(result);
/*
{
    "item1" : "some content 1",
    "item2" : { 
        "subItem2": "some content 2b", 
        "subItem3": "some content 3b" 
    },
    "item3" : { 
        "subItem1": "some content 1", 
        "subItem2": "some content 2b", 
        "subItem3": "some content 3b"
    }
}
*/

[KEY-BY]

This operator selects a key name by condition

const myJsonObject = {
    "item1" : "some content 1", 
    "[KEY-BY myVar = 'variantA'] item2a | item2b" : "some content 2", 
    "[KEY-BY myVar = 'variantB'] 'item [3|A]' | 'item [3|B]'" : "some content 3", 
};

const result = jsoncode(myJsonObject, {myVar: 'variantA'});
console.log(result);
/*
{
    "item1"      : "some content 1",
    "item2a"     : "some content 2",
    "item [3|B]" : "some content 3",
}
*/

[FROM], [...FROM]

This operator sets the value of an element from a property

const myJsonObject1 = {
    "item1" : "some content",
    "item2 [FROM]" : "myVariable1"
};
const myJsonObject2 = {
    "item1" : "some content 1",
    "item2" : "some content 2",
    "[...FROM]" : "myVariable2"
};

const result1 = jsoncode(myJsonObject1, {myVariable1: 'some value'});
console.log(result1);
/*
{
    "item1" : "some content",
    "item2" : "some value"
}
*/

const result2 = jsoncode(myJsonObject2, {
    myVariable2: { item2: 'some value 2', item3: 'some value 3' }
});
console.log(result2);
/*
{
    "item1" : "some content 1",
    "item2" : "some value 2",
    "item3" : "some value 3"
}
*/

You can set the value from the entire model using the @ symbol

"item1 [FROM]": "@"

Selectors

"getParams"
Get variable names from json

const myJsonObject = {
    "item1 [IF myProp1 = 'myString']": "value 1",
    "item2 [BY myProp2]": {
        "propVal1" : "value 2a",
        "propVal2" : "value 2b"
    }
};

const usingParams = jsoncode(myJsonObject).getParams();
console( usingParams );
/*
    ['myProp1', 'myProp2']
*/

"getValuesOf"
Get potential values of selected variable from json

const myJsonObject = {
    "item1 [IF myProp1 = 'myString']": "value 1",
    "item2 [BY myProp2]": {
        "propVal1" : "value 2a",
        "propVal2" : "value 2b"
    }
};

const myProp1Values = jsoncode(myJsonObject).getValuesOf('myProp1');
console( myProp1Values );
/*
    ['myString']
*/

const myProp2Values = jsoncode(myJsonObject).getValuesOf('myProp2');
console( myProp2Values );
/*
    ['propVal1', 'propVal2']
*/