Парсинг JSON в Lazarus

json-logoРаботая с API, многие сталкиваются с таким типом данных как JSON:

JSON (англ. JavaScript Object Notation, обычно произносится как /ˈsən/) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан Дугласом Крокфордом.

https://ru.wikipedia.org/wiki/JSON

Ниже я расскажу вам как парсить этот тип данных с помощью стандартных средств Lazarus, а так же с помощью библиотеки Superobject который я использовал при работе с API Telegram

Итак для начала возьмём произвольные данные в нашем формате:

{"user":
    {   "id": 777,
        "name": "Oleg",
        "password": "devlaz",
        "groups": [ "admins", "users", "bloger"]
    }
}

И первое что нужно сделать для работы с JSON, это добавить в Uses:

uses
..., Fpjson, jsonparser;

Например для того чтобы получить данные name, визуально мы видим что это Oleg, для того чтобы получить эти данные в программе требуется выполнить следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
  J: TJSONData;
begin
  J:=GetJSON(Memo1.Text);  //Место где мы берем данные, в моем случаем это Memo1
  Memo2.Text:=J.FindPath(Edit1.Text).AsString; //Куда копируем результат, и путь до значение которое требуется
  J.Free; //Не забываем освобождать память, иначе будут утечки...
end;

Путь до данных выглядит следующим образом: user.name

1

J.FindPath(Edit1.Text).AsString

Мы можем считывать не только строковые данные, но и целые, логические… (AsInteger, AsBoolean, AsFloat…)

Например параметр groups имеет вложенный массив. Для того чтобы получить все данные от туда в виде:

[ "admins", "users", "bloger"]

можно выполнить:

Memo2.Text:=J.FindPath('user.groups').AsJSON;

Для работы с большими данными я все же советую использовать superobject: Скачать, в нем процедуру более понятные и простые для использования.

Например для получения значений из данных выше требуется выполнить:

Uses superobject;


procedure TForm1.Button2Click(Sender: TObject);
var
 JS: ISuperObject;
 JSA:TSuperArray;
begin
 JS := SO(Memo1.Text); // получаем данные
 Memo2.Lines.Add(JS.s['user.name']); // получаем строку
 Memo2.Lines.Add(IntToStr(JS.i['user.id'])); // получаем число
 JSA:=JS.A['user.groups'];
 Memo2.Lines.Add(JSA.s[0]); // получаем элемент массива
 //JS.O["Путь до вложенного объекта"]; // получаем вложенный объект
end;

2

3

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

 

 

 

 

Парсинг JSON в Lazarus обновлено: 22 апреля, 2016 автором: Oleg E.
Share

9 комментариев “Парсинг JSON в Lazarus

  1. Возможно ли добавлять или удалять внутренние узлы непосредственно в объекте?

    • Вопрос снят, через superobject делается элементарно а то в fpjson как то все «не однозначно».

  2. Как в цикле пройтись по записям,если записей несколько?
    {«user»:
    { «id»: 777,
    «name»: «Oleg»,
    «password»: «devlaz»,
    «groups»: [ «admins», «users», «bloger»]
    },
    { «id»: 777,
    «name»: «Oleg»,
    «password»: «devlaz»,
    «groups»: [ «admins», «users», «bloger»]
    }
    }

  3. Пробовал писать на Lazarus 1.8, и для стандартных библиотек и для superobject.pas выводится ошибка EXTERNAL:SIGSEGV для строк кода, в которых данные из JSON записываются в Memo. В чем может быть проблема?
    Можете скинуть ваши исходники кода?

    • Нашел на форумах, что такая ошибка встречается, если не создан объект при помощи конструктора Create.
      Добавил строчку J:=JSONData.Create; ,стала вылазить другая ошибка.

    • аааа, моя невнимательность))
      вместо user.name вводил просто name
      блин, 2 вечера в никуда ушло

  4. Какой-то ужос.. у меня копипаст и не запускается.. EScannerError вылазиет и все тут..
    Думаю ге тут ошибиться-то..
    И кстати Create вообще ломает все еще больше.. как мне показалось )
    В примерах http://wiki.freepascal.org/fcl-json Create тоже не используется.

Добавить комментарий

Ваш адрес email не будет опубликован.