The Json: module parses, inspects, builds, and serializes JSON. Documents are named and held in memory until freed. Paths use dot notation; numeric parts index arrays. Use "" for the root node.
| Call | Effect |
|---|---|
Json:NewObject name |
Create an empty {} document (no parens) |
Json:NewArray name |
Create an empty [] document (no parens) |
Json:Parse(str, name) |
Parse JSON string into named doc |
Json:Free(name) |
Release document |
Json:Stringify(path, name, outVar) |
Serialize doc or subtree → outVar |
Json:Get(path, name, outVar) |
Read value → outVar (typed: Number/String/Boolean; objects/arrays → JSON string) |
Json:Has(path, name, outVar) |
true if path exists → outVar |
Json:Type(path, name, outVar) |
"object" "array" "string" "number" "bool" "null" → outVar |
Json:Length(path, name, outVar) |
Element count for array or object → outVar |
Json:Keys(path, name, listName) |
Object keys → pre-declared List:String |
Json:Set(path, value, name) |
Write scalar at path (creates keys as needed) |
Json:Push(path, value, name) |
Append scalar to array at path ("" = root) |
Path examples: "name", "user.age", "items.0", "data.scores.2". Use "" for root.
Var:Number status;
Var:String name;
Var:String typeStr;
Var:Number len;
Var:String out;
// Parse and read
Json:Parse("{\"status\":200,\"user\":{\"name\":\"Alice\",\"scores\":[95,82]}}", resp);
Json:Get("status", resp, status);
Konsol:Print(status); // 200
Json:Get("user.name", resp, name);
Konsol:Print(name); // Alice
Json:Type("user.scores", resp, typeStr);
Konsol:Print(typeStr); // array
Json:Length("user.scores", resp, len);
Konsol:Print(len); // 2
// Build and serialize
Json:NewObject cfg;
Json:Set("host", "localhost", cfg);
Json:Set("port", 8080, cfg);
Json:Stringify("", cfg, out);
Konsol:Print(out); // {"host":"localhost","port":8080}
// Build array
Json:NewArray tags;
Json:Push("", "fast", tags);
Json:Push("", "safe", tags);
Json:Stringify("", tags, out);
Konsol:Print(out); // ["fast","safe"]
Json:Free(resp);
Json:Free(cfg);
Json:Free(tags);
// 25_json.ks — Json module
Var:String strVal;
Var:Number numVal;
Var:Boolean boolVal;
Var:Boolean found;
Var:String typeStr;
Var:Number sz;
List:String keyList;
Konsol:Print("=== parse flat object ===");
Json:Parse("{\"name\":\"Alice\",\"age\":30,\"active\":true}", user);
Json:Get("name", user, strVal);
Konsol:Print(strVal); // Alice
Json:Get("age", user, numVal);
Konsol:Print(numVal); // 30
Json:Get("active", user, boolVal);
Konsol:Print(boolVal); // true
Konsol:Print("=== type detection ===");
Json:Type("name", user, typeStr);
Konsol:Print(typeStr); // string
Json:Type("age", user, typeStr);
Konsol:Print(typeStr); // number
Json:Type("active", user, typeStr);
Konsol:Print(typeStr); // bool
Konsol:Print("=== has ===");
Json:Has("name", user, found);
Konsol:Print(found); // true
Json:Has("missing", user, found);
Konsol:Print(found); // false
Konsol:Print("=== keys ===");
Json:Keys("", user, keyList);
List:Size(keyList, sz);
Konsol:Print(sz); // 3
Konsol:Print("=== parse array ===");
Json:Parse("[10,20,30,40,50]", nums);
Json:Type("", nums, typeStr);
Konsol:Print(typeStr); // array
Json:Length("", nums, sz);
Konsol:Print(sz); // 5
Json:Get("0", nums, numVal);
Konsol:Print(numVal); // 10
Json:Get("4", nums, numVal);
Konsol:Print(numVal); // 50
Konsol:Print("=== nested object ===");
Json:Parse("{\"status\":200,\"data\":{\"id\":7,\"name\":\"Bob\",\"scores\":[95,82,77]}}", resp);
Json:Get("status", resp, numVal);
Konsol:Print(numVal); // 200
Json:Get("data.name", resp, strVal);
Konsol:Print(strVal); // Bob
Json:Get("data.id", resp, numVal);
Konsol:Print(numVal); // 7
Json:Get("data.scores.0", resp, numVal);
Konsol:Print(numVal); // 95
Json:Get("data.scores.2", resp, numVal);
Konsol:Print(numVal); // 77
Json:Length("data.scores", resp, sz);
Konsol:Print(sz); // 3
Json:Type("data", resp, typeStr);
Konsol:Print(typeStr); // object
Json:Type("data.scores", resp, typeStr);
Konsol:Print(typeStr); // array
Konsol:Print("=== build object ===");
Json:NewObject doc;
Json:Set("title", "minks", doc);
Json:Set("version", 1, doc);
Json:Set("stable", true, doc);
Json:Stringify("", doc, strVal);
Konsol:Print(strVal); // {"title":"minks","version":1,"stable":true}
Konsol:Print("=== build array ===");
Json:NewArray arr;
Json:Push("", "alpha", arr);
Json:Push("", "beta", arr);
Json:Push("", "gamma", arr);
Json:Stringify("", arr, strVal);
Konsol:Print(strVal); // ["alpha","beta","gamma"]
Json:Length("", arr, sz);
Konsol:Print(sz); // 3
Konsol:Print("=== stringify nested ===");
Json:Stringify("data.scores", resp, strVal);
Konsol:Print(strVal); // [95,82,77]
Konsol:Print("=== loop over array ===");
Var:Number count;
Json:Length("data.scores", resp, count);
for (Var:Number i = 0; i < count; i++) {
Var:String path = "data.scores." + i;
Json:Get(path, resp, numVal);
Konsol:Print(numVal); // 95 82 77
}
Konsol:Print("=== free ===");
Json:Free(user);
Json:Free(nums);
Json:Free(resp);
Json:Free(doc);
Json:Free(arr);
Konsol:Print("done");