Исходный проект: superobject---> ## Этот проект больше не поддерживается!
SuperObject
Что такое JSON?
- JSON (JavaScript Object Notation) — это легкий формат обмена данными.
- Он легко читаем и записывается человеком.
- Он легко парсируется и генерируется машиной.
- Он основан на подмножестве языка программирования JavaScript, стандарта ECMA-262 3-го издания — декабря 1999 года.
- JSON — это текстовый формат, полностью независимый от языка, но использующий конвенции, знакомые программистам.
- Эти свойства делают JSON идеальным форматом обмена данными.
- Вы можете получить больше информации на json.org.
{ "name": "Jon Snow", /* это комментарий */ "dead": true, "telephones": ["000000000", "111111111111"], "age": 33, "size": 1.83, "addresses": [ { "address": "foo", "city": "The Wall", "zip": 57000 }, { "address": "foo", "city": "Winterfell", "zip": 44000 } ] }Парсинг структуры данных JSON
var obj: ISuperObject; begin obj := SO('{"foo": true}'); obj := TSuperObject.ParseString('{"foo": true}'); obj := TSuperObject.ParseStream(Stream); obj := TSuperObject.ParseFile(FileName); end;Доступ к данным
Для каждого поддерживаемого типа данных нет отдельной структуры данных. Все они являются объектами: ISuperObject.
val := obj.AsString; val := obj.AsInteger; val := obj.AsBoolean; val := obj.AsDouble; val := obj.AsArray; val := obj.AsObject; val := obj.AsMethod;Как прочитать значение свойства объекта?
val := obj.AsObject.S['foo']; // получить строку val := obj.AsObject.I['foo']; // получить Int64 val := obj.AsObject.F['foo']; // получить число с плавающей запятой val := obj.AsObject.B['foo']; // получить булево значение val := obj.AsObject.A['foo']; // получить массив val := obj.AsObject.O['foo']; // получить объект ``````javascript
B['foo']; // получить логическое значение val := obj.AsObject.D['foo']; // получить число с плавающей запятой val := obj.AsObject.O['foo']; // получить объект (по умолчанию) val := obj.AsObject.M['foo']; // получить метод val := obj.AsObject.N['foo']; // получить пустое значение
## Как прочитать значение из массива?
```pascal
// продвинутый способ
val := obj.AsArray.S[0]; // получить строку
val := obj.AsArray.I[0]; // получить Int64
val := obj.AsArray.B[0]; // получить логическое значение
val := obj.AsArray.D[0]; // получить число с плавающей запятой
val := obj.AsArray.O[0]; // получить объект (по умолчанию)
val := obj.AsArray.M[0]; // получить метод
val := obj.AsArray.N[0]; // получить пустое значение
Это некоторые случаи использования:
obj['foo']; // получает свойство
obj['123']; // получает элемент массива
obj['foo.list']; // получает свойство из объекта
obj['foo[123]']; // получает элемент массива из объекта
obj['foo(1,2,3)']; // вызывает метод
obj['foo[]'] := значение; // добавляет элемент массива
Вы также можете использовать вложенные пути:
obj := so('{"index": 1, "items": ["item 1", "item 2", "item 3"]}');
obj['items[index]'] // возвращает "item 2"
или создать новую структуру данных из другой:
obj := so('{"index": 1, "items": ["item 1", "item 2", "item 3"]}');
obj['{"item": items[index], "index": index}'] // возвращает {"item": "item 2", "index": 1}
Используя перечислитель Delphi, можно просматривать значения элементов массива или объекта-свойства одним и тем же образом.
var
item: ISuperObject;
begin
for item in obj['items'] do . . .
Вы также можете просматривать ключи и значения объекта следующим образом:
var
item: TSuperAvlEntry;
begin
for item in obj.AsObject do . . .
begin
item.Name;
item.Value;
end;
var
item: TSuperObjectIter;
begin
if ObjectFindFirst(obj, item) then
repeat
item.key;
item.val;
until not ObjectFindNext(item);
ObjectFindClose(item);
var
item: Integer;
begin
for item := 0 to obj.AsArray.Length - 1 do
obj.AsArray[item];
```## RTTI и маршалинг в Delphi 2010
```pascal
type
TData = record
str: string;
int: Integer;
bool: Boolean;
flt: Double;
end;
var
ctx: TSuperRttiContext;
data: TData;
obj: ISuperObject;
begin
ctx := TSuperRttiContext.Create;
try
data := ctx.AsType<TData>(SO('{str: "foo", int: 123, bool: true, flt: 1.23}'));
obj := ctx.AsJson<TData>(data);
finally
ctx.Free;
end;
end;
obj.SaveTo(stream);
obj.SaveTo(filename);
SO(['prop1', true, 'prop2', 123]); // возвращает объект {"prop1": true, "prop2": 123}
SA([true, 123]); // возвращает массив [true, 123]
Объект SuperObject
способен парсить неканонические формы.
// неотмеченные идентификаторы
SO('{foo: true}');
// незакрывающиеся или неотмеченные строки
SO('{собственность: bla bla bla}');
// шестнадцатеричные значения
SO('{foo: \xFF}');
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )