diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-12-31 19:11:20 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-12-31 19:11:20 +0000 |
commit | 87c49c3fc248ceca5557c4f873a468884a9ca14a (patch) | |
tree | 72c30f93faece2fc6ababe99e5eaef5d5fbd05fe /README.md | |
parent | aacc50ed0e986928fc314b7fbfddec9adcab36c3 (diff) | |
download | gleam_json-87c49c3fc248ceca5557c4f873a468884a9ca14a.tar.gz gleam_json-87c49c3fc248ceca5557c4f873a468884a9ca14a.zip |
Tweak examples
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 56 |
1 files changed, 35 insertions, 21 deletions
@@ -5,40 +5,54 @@ Work with JSON in Gleam! ### Encoding ```rust +import gleam/list import gleam/json.{object, string, list, int, null} -let data = object([ - #("foo", string("bar")), - #("values", list([int(1), int(2)])), - #("nope", null()) -]) -json.encode(data) -// {"foo":"bar","nope":null,"values":[1,2]} +pub type Cat { + Cat(name: String) +} + +pub fn cat_to_json(cat: Cat) -> String { + let data = object([ + #("name", string(cat.name)), + #("lives", int(9), + #("flaws", null()), + #("nicknames", list([string("Kitty"), string("Sweetie")])), + ]) + json.encode(data) +} ``` ### Decoding -Note: JSON is a dynamic data structure. -The best way to manage decode JSON data is using `gleam/dynamic`. +JSON is decoded into a `Dynamic` value which can be decoded using the +`gleam/dynamic` module from the Gleam standard library. ```rust import gleam/json -import gleam/dynamic - -let encoded = - "{\"foo\":\"bar\",\"nope\":null,\"values\":[1,2]}" +import gleam/dynamic.{DecodeError} +import gleam/result -assert Ok(data) = json.decode(encoded) -let data = dynamic.from(data) +pub type MyError { + InvalidJson + InvalidFormat(DecodeError) +} -assert Ok(foo) = dynamic.field(data, "foo") -assert Ok("bar") = dynamic.string(foo) +pub fn cat_from_json(json: String) -> Result<Cat, MyError> { + try data = + json.decode(encoded) + |> result.put_error(InvalidJson) -assert Ok(values) = dynamic.field(data, "values") -assert Ok([1, 2]) = dynamic.typed_list(values, dynamic.int) + let data = dynamic.from(data) + try cat = { + try name = dynamic.field(data, "name") + try name = dynamic.string(name) + Ok(Cat(name)) + } + |> result.map_error(InvalidFormat) -assert Ok(nope) = dynamic.field(data, "nope") -assert Ok(_) = dynamic.atom(nope) + Ok(cat) +} ``` ## Installation |