JSON Support

Astra parses JSON directly into Chains — no third-party libraries, no custom types, no boilerplate. A JSON object becomes a named-field chain. A JSON array becomes a simple chain. Nested objects become nested fields.

📄
JSON string
raw text or file
parseJson()
parse into chain
⛓️
Chain access
name1:field
🔁
toJson()
back to JSON

parseJson()

parseJson(chainName, jsonText) parses a JSON string and stores the result as a chain. The first argument is the name you want to give the chain.

JSON input

{
  "name": "Ravi",
  "age": 25
}

Astra access

write data1:name  // Ravi
write data1:age   // 25
parse.astra
jsonText = "{"name":"Ravi","age":25}" parseJson("data", jsonText) write data1:name \\ Ravi write data1:age \\ 25
💡 parseJson always creates index-1 based entries — data1, data2, etc. — just like regular chains.

Accessing Fields

After parsing, access fields exactly like named-field chains — using chainName[index]:field or chainName1:field.

access.astra
parseJson("user", "{"name":"Ravi","age":25,"city":"Hyderabad"}") write user1:name \\ Ravi write user1:age \\ 25 write user1:city \\ Hyderabad

Nested Objects

Nested JSON objects map to nested chain fields, accessible with : chaining — the same syntax as nested chains.

Nested JSON

{
  "name": "Ravi",
  "adr": {
    "city": "Hyderabad",
    "code": "500001"
  }
}

Chain access

data1:name
data1:adr:city
data1:adr:code
nested.astra
jsonText = "{"name":"Ravi","age":25,"adr":{"city":"Hyderabad","code":"500001"}}" parseJson("data", jsonText) write data1:name \\ Ravi write data1:age \\ 25 write data1:adr:city \\ Hyderabad write data1:adr:code \\ 500001

JSON Arrays

A JSON array of objects becomes a multi-entry chain. Access each element by index.

array.astra
jsonArr = "[{"name":"Ravi","adr":{"city":"Hyd"}},{"name":"Priya","adr":{"city":"Vizag"}}]" parseJson("users", jsonArr) write users1:name \\ Ravi write users1:adr:city \\ Hyd write users2:name \\ Priya write users2:adr:city \\ Vizag write len(users:n) \\ 2

Loop over JSON array

parseJson("users", jsonArr) repeat i to len(users:n) write users[i]:name write users[i]:adr:city ;

Updating Values

Parsed chain fields can be updated just like any chain — assign directly.

update.astra
parseJson("data", "{"name":"Ravi","age":25}") write data1:age \\ 25 data1:age = 30 write data1:age \\ 30

toJson()

toJson(chain:n) converts a chain back into a JSON string. Useful for saving updated data back to a file.

tojson.astra
parseJson("data", "{"name":"Ravi","age":25}") \\ Update a field data1:age = 30 \\ Convert back to JSON updatedJson = toJson(data:n) write updatedJson \\ {"name":"Ravi","age":30}
ℹ️ toJson() takes the chain name with :n suffix — same as how you reference a chain everywhere else in Astra.

JSON + File I/O

The most common pattern — read JSON from a file, parse it, update it, write it back.

config.astra
\\ Step 1: Write JSON to file f = create("config.json") plus(f, "{"name":"Ravi","age":25,"adr":{"city":"Hyd","code":"500001"}}", "raw") close(f) \\ Step 2: Read and parse f2 = create("config.json") jsonText = read(f2, "t") close(f2) parseJson("data", jsonText) write data1:name \\ Ravi write data1:age \\ 25 write data1:adr:city \\ Hyd \\ Step 3: Update a field data1:age = 30 \\ Step 4: Save back to file updatedJson = toJson(data:n) f3 = create("config.json") clear(f3) plus(f3, updatedJson, "raw") close(f3) \\ Step 5: Confirm f4 = create("config.json") finalCheck = read(f4, "t") close(f4) write finalCheck

Common Patterns

Parse inline JSON string

parseJson("user", "{"name":"Alice","score":95}") write user1:name \\ Alice write user1:score \\ 95

Parse JSON array and loop

loop-json.astra
parseJson("students", "[{"name":"Alice","score":90},{"name":"Bob","score":85},{"name":"Charlie","score":95}]") repeat i to len(students:n) write students[i]:name + " — " + students[i]:score ; \\ Alice — 90 \\ Bob — 85 \\ Charlie — 95

Round-trip: parse → update → save

roundtrip.astra
\\ Parse parseJson("cfg", "{"version":1,"debug":false}") write cfg1:version \\ 1 \\ Update cfg1:version = 2 \\ Back to JSON write toJson(cfg:n) \\ {"version":2,"debug":false}