JSON-пакет
Пакет json предоставляет класс JsonDoc как контейнер для JSON-документа и как средство для парсинга из String и записи в него.
Представление JSON
JSON в Pony представлен следующими типами:
- объект - JsonObject
- массив - JsonArray
- строка - String
- целое число - I64
- вещественное число - F64
- булево значение - Bool
- null - None
Типы коллекций JsonObject и JsonArray могут содержать любые другие JSON-структуры в произвольно вложенном виде.
JsonType используется для объединения всех возможных типов JSON. Его также можно использовать для описания всего, что можно сериализовать с помощью этого пакета.
Парсинг JSON
Для получения JSON из String в соответствующие структуры данных Pony необходимо использовать JsonDoc.parse. Это заполнит общедоступное поле JsonDoc.data, которое равно None, если parse ещё не вызывался.
Каждый вызов parse перезаписывает поле data, поэтому один экземпляр JsonDoc можно использовать для парсинга нескольких JSON-строк по одной.
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: Bool = json.data("property")? as Bool
let array: JsonArray = json.data("array")? as JsonArray
let first: I64 = array.data(0)? as I64
let second: F64 = array.data(1)? as F64
let last: Bool = array.data(2)? as Bool
Отправка JSON
JsonDoc имеет возможность передачи ref, что означает, что он по умолчанию не может быть отправлен. Если вам нужно отправить его другому актору, вам необходимо восстановить его до возможности передачи (либо val, либо iso). Для простоты рекомендуется выполнить парсинг уже в блоке восстановления:
// 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)
При отправке iso JsonDoc важно восстановить его до ref на стороне получателя, чтобы иметь возможность правильно получить доступ к JSON-структурам в data.
Запись JSON
JSON записывается с помощью метода JsonDoc.string. Это сериализует содержимое поля data в 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-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/json--index