Skip to content
118 changes: 64 additions & 54 deletions extensions/Skyhigh173/json.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@
*/

const vm = Scratch.vm;
let objectCache = {};
setInterval(() => {
objectCache = {};
}, 100); // clear the cache every 0.1 second
function parse(string) {
return objectCache[string] ?? (objectCache[string] = JSON.parse(string));
}
function stringify(object) {
const string = JSON.stringify(object);
objectCache[string] = object;
return string;
}

const hasOwn = (obj, property) =>
Object.prototype.hasOwnProperty.call(obj, property);

Expand Down Expand Up @@ -661,7 +674,7 @@
return false;
} else {
try {
JSON.parse(json);
parse(json);
return true;
} catch {
return false;
Expand All @@ -680,7 +693,7 @@
return json;
} else {
try {
return JSON.parse(json) ?? "";
return parse(json) ?? "";
} catch {
return json;
}
Expand All @@ -690,7 +703,7 @@
json_is({ json, types }) {
if (!this.json_is_valid({ json: json })) return false;
try {
json = JSON.parse(json);
json = parse(json);
switch (types) {
case "Object":
return !Array.isArray(json);
Expand All @@ -706,7 +719,7 @@

json_length({ json }) {
try {
json = JSON.parse(json);
json = parse(json);
return Object.keys(json).length;
} catch {
return " ";
Expand All @@ -727,8 +740,7 @@
json_has_key({ json, key }) {
try {
return (
this._fixInvalidJSONValues(this.json_valid_return(key)) in
JSON.parse(json)
this._fixInvalidJSONValues(this.json_valid_return(key)) in parse(json)
);
} catch {
return false;
Expand All @@ -737,7 +749,7 @@

json_has_value({ json, value }) {
try {
json = JSON.parse(json);
json = parse(json);
value = this.json_valid_return(value);
return json.includes(value);
} catch {
Expand All @@ -747,8 +759,8 @@

json_equal({ json1, equal, json2 }) {
try {
json1 = JSON.parse(json1);
json2 = JSON.parse(json2);
json1 = parse(json1);
json2 = parse(json2);

const keys1 = Object.keys(json1);
const keys2 = Object.keys(json2);
Expand All @@ -765,16 +777,14 @@

json_get_all({ Stype, json }) {
try {
json = JSON.parse(json);
json = parse(json);
switch (Stype) {
case "keys":
return JSON.stringify(Object.keys(json).map((key) => key ?? ""));
return stringify(Object.keys(json).map((key) => key ?? ""));
case "values":
return JSON.stringify(
Object.keys(json).map((key) => json[key] ?? "")
);
return stringify(Object.keys(json).map((key) => json[key] ?? ""));
case "datas":
return JSON.stringify(
return stringify(
Object.keys(json).map((key) => [key, json[key] ?? ""])
);
default:
Expand All @@ -787,11 +797,11 @@

json_get({ item, json }) {
try {
json = JSON.parse(json);
json = parse(json);
if (hasOwn(json, item)) {
const result = json[item] ?? "";
if (typeof result === "object") {
return JSON.stringify(result);
return stringify(result);
} else {
return result;
}
Expand All @@ -813,21 +823,21 @@

json_set({ item, value, json }) {
try {
json = JSON.parse(json);
json = parse(json);
value = this.json_valid_return(value);
value = this._fixInvalidJSONValues(value);
json[item] = value;
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
}

json_delete({ item, json }) {
try {
json = JSON.parse(json);
json = parse(json);
delete json[item];
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
Expand All @@ -846,7 +856,7 @@
if (item > 0) {
item--;
}
json = JSON.parse(json);
json = parse(json);
let result;
if (item >= 0) {
result = json[item];
Expand All @@ -856,7 +866,7 @@
}
result = result ?? "";
if (typeof result == "object") {
return JSON.stringify(result);
return stringify(result);
} else {
return result;
}
Expand All @@ -867,9 +877,9 @@

json_array_itemH({ item, json }) {
try {
json = JSON.parse(json);
json = parse(json);
item = this._fixInvalidJSONValues(this.json_valid_return(item));
let result = JSON.stringify(json.indexOf(item) + 1);
let result = stringify(json.indexOf(item) + 1);
return result;
} catch {
return "";
Expand All @@ -878,69 +888,69 @@

json_array_from({ json }) {
try {
return JSON.stringify(Array.from(String(json)));
return stringify(Array.from(String(json)));
} catch {
return "";
}
}

json_array_concat({ json, json2 }) {
try {
json = JSON.parse(json);
json2 = JSON.parse(json2);
return JSON.stringify(json.concat(json2));
json = parse(json);
json2 = parse(json2);
return stringify(json.concat(json2));
} catch {
return "";
}
}

json_array_push({ item, json }) {
try {
json = JSON.parse(json);
json = parse(json);
Comment thread
LegoBrainBiker marked this conversation as resolved.
item = this._fixInvalidJSONValues(this.json_valid_return(item));
json.push(item);
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
}

json_array_insert({ item, pos, json }) {
try {
json = JSON.parse(json);
json = parse(json);
item = this._fixInvalidJSONValues(this.json_valid_return(item));
json.splice(pos - 1, 0, item);
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
}

json_array_set({ item, pos, json }) {
try {
json = JSON.parse(json);
json = parse(json);
json[pos - 1] = this._fixInvalidJSONValues(
this.json_valid_return(item)
);
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
}

json_array_delete({ item, json }) {
try {
json = JSON.parse(json);
json = parse(json);
json.splice(item - 1, 1);
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
}

json_array_remove_all({ item, json }) {
try {
json = JSON.parse(json);
json = parse(json);
item = this._fixInvalidJSONValues(this.json_valid_return(item));
let i = 0;
while (i < json.length) {
Expand All @@ -950,52 +960,52 @@
++i;
}
}
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
}

json_array_fromto({ json, item, item2 }) {
try {
return JSON.stringify(JSON.parse(json).slice(item - 1, item2));
return stringify(parse(json).slice(item - 1, item2));
} catch {
return "";
}
}

json_array_reverse({ json }) {
try {
return JSON.stringify(JSON.parse(json).reverse());
return stringify(parse(json).reverse());
} catch {
return "";
}
}

json_array_flat({ json, depth }) {
try {
return JSON.stringify(JSON.parse(json).flat(depth));
return stringify(parse(json).flat(depth));
} catch {
return "";
}
}

json_array_create({ text, d }) {
return JSON.stringify(String(text).split(d));
return stringify(String(text).split(d));
}

json_array_join({ json, d }) {
try {
return JSON.parse(json).join(d);
return parse(json).join(d);
} catch {
return "";
}
}

json_array_filter({ key, json }) {
try {
json = JSON.parse(json);
return JSON.stringify(
json = parse(json);
return stringify(
json.map((x) => {
if (hasOwn(x, key)) {
return x[key];
Expand All @@ -1010,9 +1020,9 @@

json_array_setlen({ json, len }) {
try {
json = JSON.parse(json);
json = parse(json);
json.length = len;
return JSON.stringify(json);
return stringify(json);
} catch {
return "";
}
Expand All @@ -1022,7 +1032,7 @@
try {
let listVariable = this.lookupList(list, util);
if (listVariable) {
return JSON.stringify(listVariable.value);
return stringify(listVariable.value);
}
} catch (e) {
// ignore
Expand All @@ -1033,10 +1043,10 @@
try {
let listVariable = this.lookupList(list, util);
if (listVariable) {
const array = JSON.parse(json);
const array = parse(json);
if (Array.isArray(array)) {
const safeArray = array.map((i) => {
if (typeof i === "object") return JSON.stringify(i);
if (typeof i === "object") return stringify(i);
return i ?? "";
});
listVariable.value = safeArray;
Expand All @@ -1051,7 +1061,7 @@
json_array_sort(args) {
let list;
try {
list = JSON.parse(args.list);
list = parse(args.list);
} catch {
return "";
}
Expand All @@ -1060,12 +1070,12 @@
}
list.sort(Scratch.Cast.compare);
if (args.order === "descending") list.reverse();
return JSON.stringify(list);
return stringify(list);
}
json_array_analysis(args) {
let list;
try {
list = JSON.parse(args.list);
list = parse(args.list);
} catch {
return 0;
}
Expand Down
Loading