Skip to content

json

JSON parsing and serialization. Built on cJSON (MIT license).

Version v0.1
Platform PC, ESP32
Type Native (C)

star.mod

require dev-libs/json v0.1

Usage

import "json"

Functions

Parsing

Function Signature Description
json.parse(src) (string) -> dict Parse JSON object string into dict
json.parseArray(src) (string) -> array Parse JSON array string into array
var obj: dict = json.parse("{\"name\":\"star\",\"version\":1}")
assert(obj["name"] == "star")
assert(obj["version"] == 1)

var arr: array = json.parseArray("[10, 20, 30]")
assert(arr.len() == 3)
assert(arr[0] == 10)

Use json.parse when the root JSON value is an object, json.parseArray when it is an array.

Type Mapping

JSON values are converted to StarLang types:

JSON StarLang
"string" string
123, 3.14 number
true, false bool
null nil
[...] array
{...} dict

Nested objects and arrays are converted recursively.

Serialization

Function Signature Description
json.stringify(val) (dict) -> string Serialize dict to compact JSON string
json.stringifyArray(val) (array) -> string Serialize array to compact JSON string
json.pretty(val) (dict) -> string Serialize dict to indented JSON string
var obj: dict = {"name": "star", "version": 1}
var s: string = json.stringify(obj)
# {"name":"star","version":1}

var p: string = json.pretty(obj)
# {
#     "name": "star",
#     "version": 1
# }

var arr: array = [1, 2, 3]
var a: string = json.stringifyArray(arr)
# [1,2,3]

Helpers

Function Signature Description
json.has(obj, key) (dict, string) -> bool Check if key exists in dict
json.get(obj, key) (dict, string) -> string Get string value by key
var obj: dict = json.parse("{\"name\":\"star\",\"count\":42}")

if (json.has(obj, "name")) {
    var name: string = json.get(obj, "name")
}

# For non-string values, use dict subscript access:
var count: number = obj["count"]

json.get is typed as returning string. For number, bool, or nested values, use dict subscript access (obj["key"]) directly.

Roundtrip

Parse and stringify are complementary — data survives a roundtrip:

var src: string = "{\"x\":42,\"y\":true}"
var parsed: dict = json.parse(src)
var back: string = json.stringify(parsed)
var reparsed: dict = json.parse(back)
assert(reparsed["x"] == 42)
assert(reparsed["y"] == true)

Notes

  • Invalid JSON input causes json.parse to return nil
  • json.stringify outputs compact JSON (no whitespace)
  • json.pretty outputs indented JSON (4 spaces)
  • String escapes (\", \\, \n, \t, \uXXXX) are handled by cJSON
  • On ESP32, cJSON is already part of ESP-IDF — no extra dependency