Json

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);

Examples

// 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");