parseJSONArray (json, setCb, endCb) {
    try {
      if (this.keyPath === undefined) {
        return endCb('No keyPath set');
      }

      const keyPath = this.keyPath.split('.');

      // Convert shortcuts into array of key path
      const shortcuts = [];
      const shortcutsValue = [];
      for (const k in this.shortcuts) {
        shortcuts.push(k.split('.'));
        shortcutsValue.push(this.shortcuts[k]);
      }

      for (let i = 0; i < json.length; i++) {
        // Walk the key path
        let key = json[i];
        for (let j = 0; key && j < keyPath.length; j++) {
          key = key[keyPath[j]];
        }

        if (key === undefined || key === null) {
          continue;
        }

        const args = [];
        // Check each shortcut
        for (let k = 0; k < shortcuts.length; k++) {
          let objs = json[i];
          // Walk the shortcut path
          for (let j = 0; objs && j < shortcuts[k].length; j++) {
            objs = objs[shortcuts[k][j]];
          }

          // Always pretend we have an array
          if (!Array.isArray(objs)) {
            objs = [objs];
          }

          for (let o = 0; o < objs.length; o++) {
            const obj = objs[o];
            if (obj !== undefined && obj !== null && obj !== '') {
              args.push(shortcutsValue[k].pos);
              if (shortcutsValue[k].mod === 1) {
                args.push(obj.toLowerCase());
              } else if (shortcutsValue[k].mod === 2) {
                args.push(obj.toUpperCase());
              } else {
                args.push(obj);
              }
            }
          }
        }

        if (Array.isArray(key)) {
          key.forEach((part) => {
            setCb(part, WISESource.encodeResult.apply(null, args));
          });
        } else {
          setCb(key, WISESource.encodeResult.apply(null, args));
        }
      }
      endCb(null);
    } catch (e) {
      endCb(e);
    }
  }
Util function to parse JSON formatted data
@param {string} body - the raw JSON data
@param {function} setCb - the function to call for each row found
@param {function} endCB - all done parsing