Перейти к содержанию
  • Регистрация

Вопрос

Привет Всем!

 

Решил поделится впечатлениями по работе с 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

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


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

Рекомендуемые сообщения

  • 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']

 

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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

    • От 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 пользователей онлайн

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

×
×
  • Создать...