Работая с API, многие сталкиваются с таким типом данных как JSON:
JSON (англ. JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат 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
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;
Если у вас остались вопросы, задавайте я постараюсь на них ответить. Так же если вам помогла моя статья, то советую подписаться на рассылку моих новостей в правой части сайта.
Возможно ли добавлять или удалять внутренние узлы непосредственно в объекте?
Вопрос снят, через superobject делается элементарно а то в fpjson как то все «не однозначно».
Как в цикле пройтись по записям,если записей несколько?
{«user»:
{ «id»: 777,
«name»: «Oleg»,
«password»: «devlaz»,
«groups»: [ «admins», «users», «bloger»]
},
{ «id»: 777,
«name»: «Oleg»,
«password»: «devlaz»,
«groups»: [ «admins», «users», «bloger»]
}
}
Пробовал писать на Lazarus 1.8, и для стандартных библиотек и для superobject.pas выводится ошибка EXTERNAL:SIGSEGV для строк кода, в которых данные из JSON записываются в Memo. В чем может быть проблема?
Можете скинуть ваши исходники кода?
Нашел на форумах, что такая ошибка встречается, если не создан объект при помощи конструктора Create.
Добавил строчку J:=JSONData.Create; ,стала вылазить другая ошибка.
аааа, моя невнимательность))
вместо user.name вводил просто name
блин, 2 вечера в никуда ушло
Какой-то ужос.. у меня копипаст и не запускается.. EScannerError вылазиет и все тут..
Думаю ге тут ошибиться-то..
И кстати Create вообще ломает все еще больше.. как мне показалось )
В примерах http://wiki.freepascal.org/fcl-json Create тоже не используется.
Простите за офтоп, а как подключить superobject.. можете подсказать нубу ?