ФЭНДОМ


ИМЯ

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.