Skip to main content

Json

Wing has a dedicated type named Json for representing JSON. A Json value can be an object, but it can also be an array, string, boolean, number, or null.

main.w
let person = Json {
firstName: "John",
lastName: "Smith"
};

// stringify
log(Json.stringify(person)); // {"firstName":"John","lastName":"Smith"}

// parse
log(Json.parse("\{\"firstName\":\"John\",\"lastName\":\"Smith\"}")); // { firstName: 'John', lastName: 'Smith' }

// Try and parse
if let jsonFromTryParse = Json.tryParse("\{\"firstName\":\"John\",\"lastName\":\"Smith\"}") {
log("{jsonFromTryParse}"); // {"firstName":"John","lastName":"Smith"}
} else {
log("failed to parse string to JSON");
}

// Deep copy of Json
let newPerson = Json.deepCopy(person);
log(Json.stringify(person)); // {"firstName":"John","lastName":"Smith"}


Using Json literals

main.w
let j = Json {
k1: 1,
k2: "hello",
k3: true,
k4: {
k1: [1, "a", true, {} ]
}
};
log("{j}"); // {"k1":1,"k2":"hello","k3":true,"k4":{"k1":[1,"a",true,{}]}}

let jsonStrValue = Json "Hello";
log("{jsonStrValue}"); // "Hello"

let jsonNumValue = Json 42;
log("{jsonNumValue}"); // 42

let jsonBoolValue = Json true;
log("{jsonBoolValue}"); // true

let jsonHomogeneousArrayValue = Json ["a", "b"];
log("{jsonHomogeneousArrayValue}"); // ["a","b"]

From existing variables

main.w
let x: num = 42;
let jsonNum = Json x;
log("{jsonNum}"); // 42

let chars = Array<str>["a", "b"];
let jsonChars = Json chars;
log("{jsonChars}"); // ["a","b"]

let jsonComplex = Json { "first": x, "second": chars };
log("{jsonComplex}"); // {"first": 42, "second": ["a","b"]}

Enumerating

Over keys

let j = Json {
k1: "v1",
k2: "v2"
};
for k in Json.keys(j) {
let value = j.get(k);
log("found key {k} with value {value}");
}

Over values

let j = Json {
k1: "v1",
k2: "v2"
};
for value in Json.values(j) {
log("found value {value}");
}

Over a json array

let arrayValue = Json ["a", "b", "c"];
for v in Json.values(arrayValue) {
log(str.fromJson(v));
}

Safely convert to primitives

To str

let j = Json {
k: "hello"
};

log(j.get("k").asStr());

To num

let j = Json {
k: 12
};
log("{j.get("k").asNum()}");

To bool

let j = Json {
k:true
};
log("{j.get("k").asBool()}");

Safely convert to structs

struct Foo {
val1: str;
val2: num;
}

let jFoo = {
val1: "cool",
val2: 21
};

let foo = Foo.fromJson(jFoo);