JSON Toolkit
Dependencies
import {
"oboard/jsonx"
}///|
test "opt" {
let ok : Int? = @jsonx.opt(42.0)
assert_true(ok is Some(42))
let bad : Int? = @jsonx.opt("42")
assert_true(bad is None)
}///|
test "nul" {
let explicit_null : String?? = @jsonx.nul(null)
assert_true(explicit_null is Some(None))
let present : String?? = @jsonx.nul("Ada")
assert_true(present is Some(Some("Ada")))
let bad : String?? = @jsonx.nul(true)
assert_true(bad is None)
}///|
test "path reads" {
let obj : Json = {
"user": { "profile": { "name": "Ada", "age": 37.0 } },
"items": { "1": "first" },
}
let name : String? = @jsonx.get(obj, "user.profile.name")
assert_true(name is Some("Ada"))
let age : Int? = @jsonx.get(obj, ["user", "profile", "age"])
assert_true(age is Some(37))
assert_true(@jsonx.strf(obj, "items.1") is Some("first"))
let missing : String? = @jsonx.get(obj, ["user", "missing"])
assert_true(missing is None)
}///|
test "coercions" {
assert_true(@jsonx.str(12.0) is Some("12"))
assert_true(@jsonx.str(true) is None)
assert_true(@jsonx.int("42") is Some(42))
assert_true(@jsonx.int("x") is None)
}///|
test "sub object" {
let obj : Map[String, Json] = {
"child": { "label": "nested" },
"text": "nested",
}
guard @jsonx.sub(obj, "child") is Some(child) else {
fail("expected child object")
}
assert_true(@jsonx.strf(Json::object(child), "label") is Some("nested"))
assert_true(@jsonx.sub(obj, "text") is None)
}///|
#jsonxstruct
pub(all) struct Person {
name : String
age : Int
#jsonxkey("method")
method_ : String
}moon run cmd/jsonxgen -- -o person.g.mbt person.mbt///|
pub impl ToJson for Person with to_json(self) {
{ "name": self.name, "age": self.age, "method": self.method_ }
}
///|
pub impl FromJson for Person with from_json(json, path) {
guard json is Object(obj) else {
raise @json.JsonDecodeError((path, "expected object"))
}
let name = match obj.get("name") {
Some(String(name)) => name
_ => raise @json.JsonDecodeError((path, "expected string for 'name'"))
}
let age = match obj.get("age") {
Some(Number(age, ..)) => age.to_int()
_ => raise @json.JsonDecodeError((path, "expected number for 'age'"))
}
let method_ = match obj.get("method") {
Some(String(method_)) => method_
_ => raise @json.JsonDecodeError((path, "expected string for 'method'"))
}
Person::{ name, age, method_ }
}JSON Toolkit
Dependencies