RandomWallpaperGnome3/randomwallpaper@iflow.space/jsonpath/jsonpath.js

91 lines
2.2 KiB
JavaScript
Raw Permalink Normal View History

var JSONPathParser = function () {
2017-08-23 18:24:15 +00:00
/**
* Access a simple json path expression of an object.
* Returns the accessed value or null if the access was not possible.
*
* @param inputObject the object to access
* @param inputString the json path expression
* @returns {*}
*/
2018-07-27 15:36:47 +00:00
this.access = function (inputObject, inputString) {
2017-08-23 18:24:15 +00:00
if (inputObject === null || inputObject === undefined) {
return null;
}
if (inputString.length === 0) {
return inputObject;
}
let startDot = inputString.indexOf('.');
if (startDot === -1) {
startDot = inputString.length;
}
let keyString = inputString.slice(0, startDot);
2018-07-27 15:36:47 +00:00
let inputStringTail = inputString.slice(startDot + 1);
2017-08-23 18:24:15 +00:00
let startParentheses = keyString.indexOf('[');
if (startParentheses === -1) {
2017-10-07 17:09:33 +00:00
let targetObject = this._getTargetObject(inputObject, keyString);
if (targetObject == null) {
2017-08-23 18:24:15 +00:00
return null;
}
2017-10-07 17:09:33 +00:00
return this.access(targetObject, inputStringTail)
2017-08-23 18:24:15 +00:00
} else {
2018-07-27 15:36:47 +00:00
let indexString = keyString.slice(startParentheses + 1, keyString.length - 1);
2017-08-23 18:24:15 +00:00
keyString = keyString.slice(0, startParentheses);
2017-10-07 17:09:33 +00:00
let targetObject = this._getTargetObject(inputObject, keyString);
if (targetObject == null) {
2017-08-23 18:24:15 +00:00
return null;
}
switch (indexString) {
2018-07-27 15:36:47 +00:00
case "@random":
return this.access(this.randomElement(targetObject), inputStringTail);
2017-08-23 18:24:15 +00:00
// add special keywords here
2018-07-27 15:36:47 +00:00
default:
// expecting integer
return this.access(targetObject[parseInt(indexString)], inputStringTail);
2017-08-23 18:24:15 +00:00
}
}
};
2017-10-07 17:09:33 +00:00
/**
* Check validity of the key string and return the target object or null.
* @param inputObject
* @param keyString
* @returns {*}
* @private
*/
this._getTargetObject = function (inputObject, keyString) {
if (!keyString.empty && keyString !== "$" && !inputObject.hasOwnProperty(keyString)) {
return null;
}
return (keyString === "$") ? inputObject : inputObject[keyString];
};
2017-08-23 18:24:15 +00:00
/**
* Returns the value of a random key of a given object.
*
* @param inputObject
* @returns {*}
*/
2018-07-27 15:36:47 +00:00
this.randomElement = function (inputObject) {
2017-08-23 18:24:15 +00:00
let keys = Object.keys(inputObject);
2018-07-27 15:36:47 +00:00
let randomIndex = Math.floor(Math.random() * keys.length);
2017-08-23 18:24:15 +00:00
return inputObject[keys[randomIndex]];
}
};