The json
package provides the JsonDoc class both as a container for a JSON document and as means of parsing from and writing to String.
JSON is represented in Pony as the following types:
The collection types JsonObject and JsonArray can contain any other JSON structures arbitrarily nested.
JsonType is used to subsume all possible JSON types. It can also be used to describe everything that can be serialized using this package.
For getting JSON from a String into proper Pony data structures, JsonDoc.parse needs to be used. This will populate the public field JsonDoc.data
, which is None, if parse has not been called yet.
Every call to parse overwrites the data
field, so one JsonDoc instance can be used to parse multiple JSON Strings one by one.
let doc = JsonDoc // parsing doc.parse("{\"key\":\"value\", \"property\": true, \"array\":[1, 2.5, false]}")? // extracting values from a JSON structure let json: JsonObject = doc.data as JsonObject let key: String = json.data("key")? as String let property: Boolean = json.data("property")? as Bool let array: JsonArray = json.data("array")? let first: I64 = array.data(0)? as I64 let second: F64 = array.data(1)? as F64 let last: Bool = array.data(2)? as Bool
JsonDoc has the ref
reference capability, which means it is not sendable by default. If you need to send it to another actor you need to recover it to a sendable reference capability (either val
or iso
). For the sake of simplicity it is recommended to do the parsing already in the recover block:
// sending an iso doc let json_string = "{\"array\":[1, true, null]}" let sendable_doc: JsonDoc iso = recover iso JsonDoc.>parse(json_string)? end some_actor.send(consume sendable_doc) // sending a val doc let val_doc: JsonDoc val = recover val JsonDoc.>parse(json_string)? end some_actor.send_val(val_doc)
When sending an iso
JsonDoc it is important to recover it to a ref
on the receiving side in order to be able to properly access the json structures in data
.
JSON is written using the JsonDoc.string method. This will serialize the contents of the data
field to String.
// building up the JSON data structure let doc = JsonDoc let obj = JsonObject obj.data("key") = "value" obj.data("property") = true obj.data("array") = JsonArray.from_array([ as JsonType: I64(1); F64(2.5); false]) doc.data = obj // writing to String env.out.print( doc.string(where indent=" ", pretty_print=true) )
© 2016-2018, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/json--index