Перейти к содержанию
Fire Monkey от А до Я
  • 0

XSuperObject


DMS

Вопрос

Читал на этом форуме, что многие пользуются XSuperObject для работы с Json-ом: https://github.com/onryldz/x-superobject

Объясните, плиз, как работать в таких случаях:

1. Когда в Json так: "id_Parent":2,

то понятно что нужно брать значение так: xObj.I['id_Parent']

А если вот так - "id_Parent":null ? Как перед чтением числа проверить на его null ?

2. Что если объект есть, но он пустой:

"MemberView":[]

Как проверить на пустоту?

 

Спасибо!

Ссылка на комментарий

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

  • 0

не знаю как с null'ом, но вот MemberView - это массив (в квадратных же скобках). тут проще. что-то типа такого:

var
  MemView: ISuperArray;
  myJSON: ISuperObject;
...
  myJSON := SO('сюда загоняем json');
  MemView := myJSON.A['MemberView'];
  if MemView.Length = 0 then {Пустой массив}

П.С. глянул то, как можно проверить на null, вышло следующее (вроде работает):

var
  x: ISuperObject;
begin
  x := SO('{"value":null}');
  if x.Null['value'] = jNull then
    ShowMessage('null')
  else
    ShowMessage(x.I['value'].ToString)
end;

 

Изменено пользователем sinuke
Ссылка на комментарий
  • 0

Не могу понять, как пройтись по всем объектам и у каждого объекта по их массивам?

Цитата

{"ID":[0,55,true,false], "ID2":[1,60,false,false]}, "ID3":[2,177,false,false]}

Все примеры, которые я видел, привязываются к имени объекта.

А если нужно без имени, а если имя и значение нужно получать во время итераций?

Спасибо.

Ссылка на комментарий
  • 0

Я уже задолбался. Одни говорят, использовать, другие, говорят, не использовать.

Я пытался использовать ту, новую встроенную в Дельфи, начиная с версии 10.1 - "JSON Objects Framework"

http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON.Builders

но в Sydney есть проблема и индексами в массивах.

Ссылка на комментарий
  • 0

вроде начинает доходить

 

procedure TForm1.Button1Click(Sender: TObject);
const sJSon = '{"ID":[0,55,true,false], "ID2":[1,60,false,false], "ID3":[2,177,false,false]}';
var
  Arr: ISuperArray;
  myJSON: ISuperObject;
  OMember: IMember;
  i: integer;
begin
  myJSON := SO(sJSon);

  if myJSON.Count > 0 then
  begin

      for OMember in myJSON do
        if OMember.DataType = dtArray then
        begin
          arr := OMember.AsArray;
          Memo1.Lines.Add(IntToStr(arr.i[0]));
          Memo1.Lines.Add(IntToStr(arr.i[1]));
          Memo1.Lines.Add(BoolToStr(arr.B[2]));
          Memo1.Lines.Add(BoolToStr(arr.B[3]));
          Memo1.Lines.Add('---');
        end;
  end;
end;

 

Изменено пользователем x11
Ссылка на комментарий
  • 0
В 27.11.2020 в 16:10, Tumaso сказал:

библиотеку, которая не развивается?

Ну вот я использовал библиотеку, которая развивается и что из этого вышло?

Один и тот же код в разных версиях Дельфи (Rio и Sydney) дает разный результат

 

procedure TForm1.btnReadArrayClick(Sender: TObject);
const sJSon = '{"ID":[0,55,true,false], "ID2":[1,60,false,false]}';

var
 Iterator: TJSONIterator;
 Reader: TJsonTextReader;
 TextReader: TStringReader;
begin

  TextReader  := TStringReader.Create(sJSon);
  Reader      := TJsonTextReader.Create(TextReader);
  Iterator    := TJSONIterator.Create(Reader);

  try
    while Iterator.Next do
    begin
      if Iterator.&Type = TJsonToken.StartArray then
        if Iterator.Recurse then
          while Iterator.Next do
          begin
            Memo1.Lines.Add('Key: ' + Iterator.Key);
            Memo1.Lines.Add('Index:' + Iterator.Index.ToString);
          end;

    end;//while

  finally
    FreeAndNil(TextReader);
    FreeAndNil(Iterator);
    FreeAndNil(Reader);
  end;
end;

Речь, о встроенной в Дельфи джейсон-библиотеке (Readers and Writers JSON Framework), которая поставляется, начиная с Seatle

вот здесь есть описание на русском https://webdelphi.ru/2019/03/rabota-s-json-v-delphi-10-3-rio-2/

Screenshot_7.jpg

Изменено пользователем x11
Ссылка на комментарий
  • 0
19 часов назад, krapotkin сказал:

потому что она удобнее

все сторонние библиотеки рано или поздно превращаются в "камень в ботинке"... вопрос только во времени когда это случится...  и если написано уже много кода, то переписывание и тестирование заново всего - это очень неприятная ситуация... я бы не стал самому себе на будущее подкладывать такую свинью... только когда стандартными компонентами не обойтись никак.. или время жизни проекта 3-4 года...

Ссылка на комментарий
  • 0
14 минут назад, x11 сказал:

попробуйте спросить на sql.ru, ну и не забудьте примеры кода приложить

Код даже не нужен. Основное время уходит на загрузку через SO(<строка>)

Ссылка на комментарий
  • 0

а сам файл на каких-нибудь онлайн сервисах нормально проходит валидацию?

может джейсон немного кривоват?

Пробуйте другие парсеры.

Если у вас Delphi до 10.4.1, то новый TJSONIterator должен отработать быстрее.

Ссылка на комментарий

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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