• 0
Равиль Зарипов (ZuBy)

SuperObject vs JSON

Вопросы

Привет Всем!

 

Решил поделится впечатлениями по работе с SuperObject'ом и родным JSON'ом

 

тест был файла с 2000+ объектами в JSON файле

структура файла была такая

{
   "status":"OK",
   "last_id":"711",
   "objects":[
      {
         "obj_id":"1",
         "obj_acc_id":"1",
         "obj_cat_id":"24",
         "obj_title":"13 магистраль",
         "obj_descr":"ЖК представляет собой комфортный дом, состоящий из 14 блок-секций (подъездов). Расположен в перспективном развивающемся районе по 13 Магистрали с удобным выездом как на левый берег, так и в старую часть города. Вблизи Жилого комплекса распологается новая школа, парк отдыха и культуры.",
         "obj_address":"ул. Мамышулы - 104, д. 16\/1",
         "obj_address2":null,
         "obj_url":"3fa07dd73be072b049529c80c7d74732",
         "obj_planet":"1",
         "obj_country":"1",
         "obj_region":"1",
         "obj_city":"292",
         "obj_lat":"51.141",
         "obj_lon":"71.4835",
         "obj_insert_dt":null,
         "obj_update_dt":null,
         "obj_editted":"0",
         "obj_updated":"0",
         "obj_deleted":"0",
         "obj_showed":"1",
         "obj_rating":"0",
         "obj_pro_top":"0",
         "obj_pro_selected":"0",
         "obj_pro_unix_dt":"0",
         "obj_partner":"0",
         "obj_parent_id":"0",
         "obj_has_child":"0",
         "obj_currency":"0"
      },
     // тут далее 2000+ объектов 
   ]
}

SuperObject  Время выполнения:  ~01:393

JSON родной Время выполнения: ~01:690

 

разница не особо ощутима, тем более если будет меньше объектов

 

JSON родной

function JSONParse(const aJSONData: string; const aMemo: TMemo): boolean;
var
  aJSValue: TJSONValue;
  aJSObject, aJSObjArr: TJSONObject;
  aJSArray: TJSONArray;
  I: integer;
begin
  Result := false;
  aJSValue := TJSONObject.ParseJSONValue(aJSONData) as TJSONValue;
  if Assigned(aJSValue) then
  begin
    aJSObject := aJSValue as TJSONObject;
    aMemo.Lines.Add('status: ' + aJSObject.GetValue('status').Value);

    if aJSObject.GetValue('status').Value = 'OK' then
    begin
      Result := true;
      if Assigned(aJSObject) then
      begin
        aJSArray := aJSObject.GetValue('objects') as TJSONArray;
        if Assigned(aJSArray) then
        begin
          Result := true;
          aMemo.Lines.Add('last_id: ' + aJSObject.GetValue('last_id').Value);
          aMemo.Lines.Add('count: ' + aJSArray.Count.ToString);
          for I := 0 to aJSArray.Count - 1 do
          begin
            aJSObjArr := aJSArray.Items[I] as TJSONObject;
            if Assigned(aJSObjArr) then
            begin
              aMemo.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' +
                aJSObjArr.GetValue('obj_cat_id').Value);
              aMemo.Lines.Add(aJSObjArr.GetValue('obj_title').Value);
              aMemo.Lines.Add(aJSObjArr.GetValue('obj_descr').Value);
              aMemo.Lines.Add(aJSObjArr.GetValue('obj_address').Value);
              aMemo.Lines.Add(aJSObjArr.GetValue('obj_url').Value);
            end;
          end;
        end;
      end;
    end;
    aJSValue.Free;
  end;
end;

SuperObject

function JSONSOParse(const aJSONData: string; const aMemo: TMemo): boolean;
var
  xObject: ISuperObject;
  xCount, I: integer;
  sfmt: string;
begin
  Result := false;
  xObject := SO(aJSONData);
  aMemo.Lines.Add('status: ' + xObject['status'].AsString);

  if xObject['status'].AsString = 'OK' then
  begin
    Result := true;
    xCount := xObject['objects'].AsArray.Length;
    aMemo.Lines.Add('count: ' + xCount.ToString);
    aMemo.Lines.Add('last_id: ' + xObject['last_id'].AsInteger.ToString);

    for I := 0 to xCount - 1 do
    begin
      aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_id"'].AsInteger.ToString + ',' +
        xObject['objects[' + I.ToString + ']."obj_acc_id"'].AsInteger.ToString + ',' +
        xObject['objects[' + I.ToString + ']."obj_cat_id"'].AsInteger.ToString);
      aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_title"'].AsString);
      aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_descr"'].AsString);
      aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_address"'].AsString);
      aMemo.Lines.Add(xObject['objects[' + I.ToString + ']."obj_url"'].AsString);
    end;
  end;
end;

Разница ощутима когда пишешь код, SO намного легче читать

 

Подробней почитать и скачать SO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 ответов на этот вопрос

  • 0

работать с XSO гораздо удобнее, а уж читать код - вдвойне

и там разные штуки типа фильтров встроены

а еще при сериализации например в этом случае, XSO хорошо и удобно работает с TObjectList, а System.JSON - нет

и атрибуты при сериализации - крайне удобная вещь

и то, что EMRO никогда не переплюнет 

автор исправляет замечания прямо за пару дней )))

Изменено пользователем krapotkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Есть ли что-то типа XPath у SuperObject?

Крайне нужная штука при парсинге больших документов.

 

Показ, как работать с Where недостаточно убедителен - используются простые входные данные, без вложенности.

А бывает, к примеру, нужно вычленить что-то типа (XPath выражение):

/bookstore/book[price>35.00]/title

. Т.е. мне нужны только и исключительно теги tittle, все их корневые данные - побоку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

никогда не использовал подобное, так что не могу подсказать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Есть SuperObject и XSuperObject. Один вроде для старых версий типа Delphi 7, другой для новых?

Напомните пожалуйста какой из них подходит для Seattle?

 

PS. Вопрос возник из-за того что XSuperObject взятый отсюда выдал мне ошибку на PAnsiString, это и вызвало подозрение... (пока заменил PAnsiString на PString)

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Для старых там вряд ли что то есть. Во всех файлах есть дженерики. Подключаешь в проект только XSuperObject и пользуешься

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Сысоев Максим, спасибо за ответ.

А почему тогда ругань на PAnsiString в строке 3080?

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Не знаю. Сам активно пользуюсь этой библиотекой - все нормально компилируется

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Может версия у вас по старее... 
И кстати, раз уж обсуждаем XSuperObject, заметил в примере Where что если у Bulent ERSOY заменить Sex на M, то он попадает в выборку. Правильно ли это, ведь знак стоит > ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Видимо у вас старые версии. Выложите свои версии на всякий случай :)

 

В XSuperObject (3 дня назад менялся) сейчас строка 3089 

PAnsiString(@Result)^ := AnsiString(JSON.Cast.AsString);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

у автора на сайте висит Issue незакрытый по этому поводу

у меня более ранняя версия

 

X-Superobject.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Лично у меня последняя версия. Но пользуюсь пока только сериализациейtiJLZip.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Обновите суперОбжект - пофиксены ошибки:

 

Fixed #85

Fixed #83

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Привет уважаемые

Помогите пожалуйста распарсить json при помощи XSO

[{"orderNumber":"142141611222","type":"sell","rate":"0,00011120","startingAmount":"5,62138420"}]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

что значит распарсить?

что и куда вы хотите получить?

arr := TSuperArray.Create(json);

item := arr.o[0];

ordNum := item.s['orderNumber']

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 минут назад, krapotkin сказал:

arr := TSuperArray.Create(json);

item := arr.o[0];

ordNum := item.s['orderNumber']

 

Огромное спасибо. Это именно то что нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От rareMax
      Как убрать поле класса из сериализации через Rest.Json?
      Вот как я пробую избавиться от поля Foo:
      program Project1; {$APPTYPE CONSOLE} {$R *.res} uses REST.Json, System.JSON.Serializers, System.SysUtils; type TFoo = class private FValue1: Integer; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; end; [JsonSerialize(TJsonMemberSerialization.&Public)] TBar = class private FValue1: Integer; FFoo: TFoo; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; // property Foo: TFoo read FFoo write FFoo; end; procedure Test; var LBar: TBar; begin LBar := TBar.Create; try Writeln(TJson.ObjectToJsonString(LBar)); finally LBar.Free; end; end; begin try { TODO -oUser -cConsole Main : Insert code here } Test; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Но на выходе все равно есть поле Foo.
       
    • От ENERGY
      Друзья, нашел тут интересную статью, где тестируются разные jSON парсеры.
       
      Ссылка: http://www.webdelphi.ru/2016/10/ishhem-samyj-bystryj-parser-json-v-delphi/
      Автор: Владислав Баженов
      Описание (26/10/2016):
       
    • От unicorn
      Всем привет. 
      Мне нужно отправить запрос к серверу в формате JSON-RPC. Вопрос - как в него запихнуть json-данные правильно?
    • От Просто Проги
      Пытаюсь получить список друзей из вк получаю их по api записываю в memo.text ответ от get запроса,после пытаюсь получить из json поля
      ответ выглядит так
      { "response": { "count": 104, "items": [ { "id": 1308603, "first_name": "Виктория", "last_name": "Талина", "photo": "http://cs625517.vk.me/v625517603/4e79b/E9Q1WA5SSLiI.jpg", "photo_100": "http://cs625517.vk.me/v625517603/4e79a/15QwerpQbCKk.jpg", "photo_400_orig": "http://cs625517.vk.me/v625517603/4e7199/wxOJQyZhqq8.jpg", "online": 0 }, { "id": 282070, "first_name": "Никита", "last_name": "Багров", "photo": "http://cs630623.vk.me/v630623070/4b610/RXNNdJ6_Nik.jpg", "photo_100": "http://cs630623.vk.me/v630623070/4b60f/MDXpi0deY1A.jpg", "photo_400_orig": "http://cs630623.vk.me/v630623070/4b60e/ec7A3pBDJZ0.jpg", "online": 0 }, "first_name": "Имя ", Следующим кодом
       
      var JSON: TJSONObject; JSONArray: TJSONArray; i: Integer; begin JSON := TJSONObject.ParseJSONValue(Form2.Memo2.Lines.Text) as TJSONObject; сюда получается я заношу весь код Form2.Memo2.Lines.Clear; JSONArray := TJSONArray(JSON.Get('items').JsonValue); далее изу по массиву итмемов for i := 0 to JSONArray.Size - 1 do begin Form2.Memo2.Lines.Add(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('first_name')).JsonValue.Value); пытаюсь добавить найденное поле end; но летят ошибка критичная (
    • От rareMax
      Я работаю с библиотекой XSuperObject. Как правило, сам JSON я не парсю, а только создаю классы-прототипы данных в JSON, и пользуюсь методами .FromJSON и .ToJSON.
      пример:
      Для такого JSON'a 
      создаю такой класс:
      TvktStatus = Class private Ftext: String; FAudio: TvktAudio; published [Alias('text')] property text: String read Ftext write Ftext; [Alias('audio')] property audio: TvktAudio read FAudio write FAudio; End; в итоге не нужно парсить программисту - все делает библиотечка. 
      Теперь к самой проблеме.
      Допустим есть такой файлик с данными в формате JSON:
      Как бы вы составили такой класс-прототип? Ведь тут получается в одном массиве есть как число так и строка.
    • От rareMax
      Поддерживает ли стандартная библиотека маршалинг/демаршалинг классов? Сейчас работаю с XSuperObject - работа очень приятная с ним. Но огорчает то, что тащит за собой тяжелые библиотеки(Инди, БД). Если нет - может кто знает альтернативы полегче? В идеале будет если так же будут Marshalling Attributes
    • От M1shQa
      Получаю с сервера большой JSON, в нем есть поле number. Как получить список в memo состоящий только из номеров? Подскажите пожалуйста..
       
    • От Dion
      Добрый день, Господа.
      Давайте меняться. 
      Предлагаю вам откуда-то взятый мною superobject, версии 1.2 из которой я выкинул разный хлам, допилил и сделал так, чтобы он собирался под Android, OS X и iOS. Протестировал.
      Дальше я написал вокруг него километр кода, создал набор стилей и сделал динамическую загрузку стилей для списка. В список в соответствии со стилями можно добавить порядка 20 разных компонентов.
      Идея моя была такой.
      Есть сервер, на него с клиента загружаются стили и дальше они разливаются от сервера к серверу и в конечном счете попадают на клиентов. Грубо говоря, должен получиться тонкий клиент.
      Надо кому? 
    • От Axbor
      TJSONObject *o = dynamic_cast<TJSONObject*> (TJSONObject::ParseJSONValue(TEncoding::ASCII->GetBytes(s), 0)); if (!o) return; TJSONArray *a = dynamic_cast<TJSONArray*>(o->Get("M")->JsonValue); if (!a) return; for (int i = 0; i < a->Count; i++) { TJSONObject *b = dynamic_cast<TJSONObject*>(a->Get(i)); if (! return; Jokes[i + CurrPos].Caption = b->Pairs[0]->JsonValue->ToString(); Jokes[i + CurrPos].Content = b->Pairs[1]->JsonValue->ToString(); Count++; } delete L; L = 0;  "s" это текст которая хранит JSON внутри значений которого есть символ " (кавычка). В JONS е уже добавлены BackSlash перед такими символами. При парсинге JOSN опят добавляются BackSlash перед спец символами. Как от этого избежать?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу