print("=== JSON Encoder Demo ===");
print("");
class JSONEncoder {
JSONEncoder(this) {
}
encode(this, value) {
t = typeof(value);
if (t == "null") {
return "null";
}
if (t == "int" || t == "float") {
return str(value);
}
if (t == "str") {
return "\"" + value + "\"";
}
if (t == "array") {
return this.encodeArray(value);
}
return "null";
}
encodeArray(this, arr) {
result = "[";
for (i = 0; i < len(arr); i++) {
if (i > 0) {
result += ",";
}
result += this.encode(arr[i]);
}
result += "]";
return result;
}
}
encoder = new JSONEncoder();
print("Encoding primitives:");
print(" null ->", encoder.encode(null));
print(" 42 ->", encoder.encode(42));
print(" 3.14 ->", encoder.encode(3.14));
print(" \"hello\" ->", encoder.encode("hello"));
print("");
print("Encoding arrays:");
arr = {1, 2, 3};
print(" {1, 2, 3} ->", encoder.encodeArray(arr));
mixed = {1, "two", 3};
print(" {1, \"two\", 3} ->", encoder.encodeArray(mixed));
print("");
print("=== JSON Decoder Demo ===");
print("");
class JSONDecoder {
input = "";
pos = 0;
JSONDecoder(this) {
}
decode(this, jsonStr) {
this.input = jsonStr;
this.pos = 0;
return this.parseValue();
}
parseValue(this) {
this.skipWhitespace();
if (this.pos >= this.input.length) {
return null;
}
c = this.input.substr(this.pos, 1);
if (c == "[") {
return this.parseArray();
}
if (c == "n") {
this.pos += 4;
return null;
}
return this.parseNumber();
}
parseNumber(this) {
start = this.pos;
while (this.pos < this.input.length) {
c = this.input.substr(this.pos, 1);
isDigit = (c == "0" || c == "1" || c == "2" || c == "3" || c == "4" || c == "5" || c == "6" || c == "7" || c == "8" || c == "9" || c == "-");
if (isDigit == 0) {
break;
}
this.pos++;
}
numStr = this.input.substr(start, this.pos - start);
return int(numStr);
}
parseArray(this) {
this.pos++;
result = {};
this.skipWhitespace();
if (this.pos < this.input.length) {
c = this.input.substr(this.pos, 1);
if (c == "]") {
this.pos++;
return result;
}
}
while (this.pos < this.input.length) {
value = this.parseValue();
result.push(value);
this.skipWhitespace();
if (this.pos >= this.input.length) {
break;
}
c = this.input.substr(this.pos, 1);
if (c == "]") {
this.pos++;
break;
}
if (c == ",") {
this.pos++;
}
}
return result;
}
skipWhitespace(this) {
while (this.pos < this.input.length) {
c = this.input.substr(this.pos, 1);
if (c != " ") {
break;
}
this.pos++;
}
}
}
decoder = new JSONDecoder();
print("Decoding numbers:");
print(" \"123\" ->", decoder.decode("123"));
print(" \"456\" ->", decoder.decode("456"));
print("");
print("Decoding arrays:");
decoded = decoder.decode("[1,2,3]");
print(" \"[1,2,3]\" -> length:", len(decoded));
print(" element 0:", decoded[0]);
print(" element 1:", decoded[1]);
print(" element 2:", decoded[2]);
print("");
print("All JSON tests completed");