ИМЯ
- json - readjson, writejson, JValue - чтение, запись и представление значений в виде JavaScript Object Notation
РЕЗЮМЕ
include "json.m"; json := load JSON JSON->PATH; JValue: adt { pick{ Object => mem: cyclic list of (string, ref JValue); Array => a: cyclic array of ref JValue; String => s: string; Int => value: big; Real => value: real; True or False or Null => } isarray: fn(v: self ref JValue): int; isfalse: fn(v: self ref JValue): int; isint: fn(v: self ref JValue): int; isnull: fn(v: self ref JValue): int; isnumber: fn(v: self ref JValue): int; isobject: fn(v: self ref JValue): int; isreal: fn(v: self ref JValue): int; isstring: fn(v: self ref JValue): int; istrue: fn(v: self ref JValue): int; copy: fn(v: self ref JValue): ref Jvalue; eq: fn(v: self ref JValue, v: ref JValue): int; get: fn(v: self ref JValue, mem: string): ref JValue; set: fn(v: self ref JValue, mem: string, value: ref JValue); text: fn(v: self ref JValue): string; }; init: fn(bufio: Bufio); readjson: fn(input: ref Bufio->Iobuf): (ref JValue, string); writejson: fn(output: ref Bufio->Iobuf, val: ref JValue): int; jvarray: fn(a: array of ref JValue): ref JValue.Array; jvbig: fn(b: big): ref JValue.Int; jvfalse: fn(): ref JValue.False; jvint: fn(i: int): ref JValue.Int; jvnull: fn(): ref JValue.Null; jvobject: fn(m: list of (string, ref JValue)): ref JValue.Object; jvreal: fn(r: real): ref JValue.Real; jvstring: fn(s: string): ref JValue.String; jvtrue: fn(): ref JValue.True;
ОПИСАНИЕ
- JSON предусматривает представление значений, и операции по кодированию/декодированию JavaScript Object Notation (JSON) описанной в Internet RFC4627 кратко описанной в json(6).
Функция Init должна быть вызвана перед использованием людой другой функции этого модуля.Параметр bufio должен указывать на экземпляр bufio(2) который предоставляет параметр Iobuf используемый для ввода/вывода.
JValue является внутренним представлением значений передаваемых в кодировке JSON. Они представлены в pick adt:
- JValue.False
Представляет значение false.
- JValue.Null
Представляет значение null для любого типа.
- JValue.True
Представляет значение true.
- JValue.Int
Представлено как число big Limbo без дробной части.
- JValue.Real
Представлено как Limbo real с дробной частью.
- JValue.String
Представляет строку JavaScript состоящую из символов в Unicode от +U'0000' до +U'FFFF'.
- JValue.Array
Представляеет JavaScript массив значений любого типа.
- JValue.Object
Представляет тьюпл (член/свойство имя, значение) пар соответствующих значений объекта JavaScript, или ассоциативному массиву, или таблице проиндексированной по строкам. Имена членов должны быть уникальными значениями.
Readjson считывает одно значение в формате JSON из входного потока и возвращает тьюпл (val, err). В случае успеха, значение val является JValue, которое представлено которое представлено успешно считанным значением. В случае ошибки, val будет nil и err содержит диагностическое сообщение.
Writejson пишет в выходной поток в формате JSON представление значения v. Она возвращает 0 в случае успеха и -1 в случае ошибки (и устанавливает строку системной ошибки).
Простейшим способом создания нового JValue для последующего вывода является одна из следующих функций уровня модуля: jvarray, jvint, jvobject, jvstring, и т.д. Как значения в pick adt, JValue может быть проверено при помощи Limbo-оператора tagof и в случае подходящего варианта может быть получено выражением pick. JValue также поддерживает несколько групп общих операций, для компактного и аккуратного кода. Во-первых, набор функций запросов v.isX() возвращающих true если значение v является экземпляром JavaScript типа X (array, int, object, real, string, и т.д.). Числовым значением являются как int, так и real. Имеются следующие операции:
- v.copy()
Возвращает (ссылается) на копию значения v. Копирование не рекурсивное.
- v.eq(w)
Возвращает true если значения v и w являются равными, включая значения соответствующих под-компонентов, рекурсивная
- v.get(mem)
Возвращает значение связанное с членом названным mem в v; возвращает null если такого нет.
- v.set(mem, value)
Добавляет или изменяет значение связанное с членом mem в v, который должен быть JValue.Object ( вызывает исключение json: set non-object otherwise).
- v.text()
Возвращает строку содержащую JSON представление v.
ИСХОДНЫЙ ТЕКСТ
- /appl/lib/json.b
СМОТРИ ТАКЖЕ
- sexprs(2), ubfa(2), json(6), sexprs(6), ubfa(6)
- D Crockford, The application/json Media Type for JavaScript Object Notation (JSON), RFC4627.