Skip to content

json Module

The json module provides functions for working with JSON data, including seamless integration with Harneet's map and array types.

Functions

Marshal(value)

Converts a Harneet value to a JSON string. Supports strings, numbers, booleans, arrays, and maps.

Parameters: - value: The value to convert (string, integer, boolean, None, array, or map).

Returns: - (string, error): The JSON string representation of the value.

Examples:

Basic types:

Marshal Basic Types
package main
import fmt
import json

var data = ["apple", "banana", "cherry"]
var jsonString, err = json.Marshal(data)
if err != None {
    fmt.Println("Marshal error:", err)
} else {
    fmt.Println(jsonString) // Output: ["apple","banana","cherry"]
}

Maps to JSON objects:

Marshal Map to JSON
package main
import fmt
import json

var user = {"name": "Alice", "age": 25, "active": true}
var jsonResult, err = json.Marshal(user)
if err != None {
    fmt.Println("Marshal error:", err)
} else {
    fmt.Println(jsonResult) // Output: {"age":25,"active":true,"name":"Alice"}
}

Nested structures:

Marshal Nested Structures
package main
import fmt
import json

var config = {"database": {"host": "localhost", "port": 5432}, "debug": true}
var jsonConfig, err = json.Marshal(config)
if err != None {
    fmt.Println("Marshal error:", err)
} else {
    fmt.Println(jsonConfig) // Output: {"database":{"host":"localhost","port":5432},"debug":true}
}


Unmarshal(json_string)

Parses a JSON string into a Harneet value. JSON objects become Harneet maps, JSON arrays become Harneet arrays.

Parameters: - json_string: The JSON string to parse.

Returns: - (any, error): The parsed Harneet value (string, integer, boolean, None, array, or map).

Examples:

JSON arrays to Harneet arrays:

Unmarshal JSON Array
package main
import fmt
import json

var jsonString = "[\"apple\",\"banana\",\"cherry\"]"
var parsed, parseErr = json.Unmarshal(jsonString)
if parseErr != None {
    fmt.Println("Parse error:", parseErr)
} else {
    fmt.Println(parsed) // Output: [apple, banana, cherry]
}

JSON objects to Harneet maps:

Unmarshal JSON Object
package main
import fmt
import json

var jsonUser = "{\"name\": \"Alice\", \"age\": 25, \"active\": true}"
var user, err = json.Unmarshal(jsonUser)
if err != None {
    fmt.Println("Parse error:", err)
} else {
    fmt.Printf("User: %s\n", user) // Output: User: {name: Alice, age: 25, active: true}
    // Access map values
    // var name = user["name"]  // Returns "Alice"
    // var age = user["age"]    // Returns 25
}

Nested JSON structures:

Unmarshal Nested JSON
package main
import fmt
import json

var complexJson = "{\"users\": [{\"name\": \"Alice\"}, {\"name\": \"Bob\"}], \"meta\": {\"count\": 2}}"
var data, err = json.Unmarshal(complexJson)
if err != None {
    fmt.Println("Parse error:", err)
} else {
    fmt.Printf("Data: %s\n", data)
    // Access nested structures
    // var users = data["users"]     // Array of user maps
    // var meta = data["meta"]       // Meta information map
    // var count = meta["count"]     // Returns 2
}


Valid(json_string)

Checks if a string is a valid JSON.

Parameters: - json_string: The string to check.

Returns: - (boolean, error): true if the string is valid JSON, false otherwise.


Indent(json, prefix, indent)

Formats a JSON string with indentation.

Parameters: - json: The JSON string to format. - prefix: The prefix for each line. - indent: The indentation string.

Returns: - (string, error): The indented JSON string.


JSON-Maps Integration

The json module provides seamless integration with Harneet's map and array types, making JSON processing natural and efficient.

Type Mapping

JSON Type Harneet Type Example
object map {"key": "value"}{key: value}
array array [1, 2, 3][1, 2, 3]
string string "hello""hello"
number int or float64 4242, 3.143.14
boolean bool truetrue
null None nullNone

Round-trip Conversion

JSON data can be converted to Harneet types and back without data loss:

Round-Trip Conversion
package main
import fmt
import json

// Original Harneet data
var original = {"name": "Alice", "scores": [95, 87, 92], "active": true}

// Convert to JSON
var jsonStr, err1 = json.Marshal(original)
if err1 != None {
    fmt.Println("Marshal error:", err1)
    return
}

fmt.Printf("JSON: %s\n", jsonStr)

// Convert back to Harneet
var restored, err2 = json.Unmarshal(jsonStr)
if err2 != None {
    fmt.Println("Unmarshal error:", err2)
    return
}

fmt.Printf("Restored: %s\n", restored)
// Output: Restored: {name: Alice, scores: [95, 87, 92], active: true}

Working with API Responses

JSON APIs can be easily processed using Harneet's map operations:

JSON API Processing
package main
import fmt
import json

// Simulate API response
var apiResponse = "{\"users\": [{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}], \"total\": 2}"

var data, err = json.Unmarshal(apiResponse)
if err != None {
    fmt.Println("API parse error:", err)
    return
}

// Access API data using map operations
// var users = data["users"]
// var total = data["total"]
// var firstUser = users[0]
// var firstName = firstUser["name"]

fmt.Printf("API Data: %s\n", data)

Configuration Management

JSON configuration files can be loaded as Harneet maps:

JSON Config Files
package main
import fmt
import json

var configJson = "{\"database\": {\"host\": \"localhost\", \"port\": 5432}, \"cache\": {\"ttl\": 300, \"enabled\": true}}"

var config, err = json.Unmarshal(configJson)
if err != None {
    fmt.Println("Config parse error:", err)
    return
}

// Access configuration values
// var dbHost = config["database"]["host"]
// var cacheEnabled = config["cache"]["enabled"]

fmt.Printf("Configuration: %s\n", config)

Error Handling

The JSON module provides comprehensive error handling for invalid data:

JSON Error Handling
package main
import fmt
import json

// Invalid JSON
var invalidJson = "{\"name\": \"Alice\", \"age\": }"
var data, err = json.Unmarshal(invalidJson)
if err != None {
    fmt.Printf("JSON Error: %s\n", err)
} else {
    fmt.Printf("Data: %s\n", data)
}

// Map with non-string keys (not JSON compatible)
var invalidMap = {42: "number key", "string": "string key"}
var jsonStr, marshalErr = json.Marshal(invalidMap)
if marshalErr != None {
    fmt.Printf("Marshal Error: %s\n", marshalErr)
} else {
    fmt.Printf("JSON: %s\n", jsonStr)
}

See Also