Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 1
Регистрация: 14.04.2013
Сообщений: 36
1

Извлечь инфу из JSON текста

04.09.2019, 16:46. Показов 3322. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый день. Пытаюсь вытащить данные из JSON массива, только начал знакомиться с командами для работы с JSON в Lazarus. Почитал статьи различные, но выкидывает ошибки, видно для массива должны быть другие команды. Также вопрос что быстрее будет работать готовые команды или старая обработка текста pos,copy,length,delete итд? Мне нужно вытащить все элементы из массива items и разбить по переменным для дальнейшей записи в базу данных.
Имеется следующий json

JSON
1
{"alerts":[],"items":[{"orderId":110680291,"check":false,"subdivision":{"code":"411","name":"Санкт-Петербург (На Проспекте Просвещения)"},"organization":{"code":"272","name":"ООО \"С-ЭСТЕЙТ\""},"orderDate":"05.07.2019","dateDD":"06.08.2019","numberOrd":1128374238,"cityFrom":"Санкт-Петербург","cityTo":"Москва","tariff":"Экспресс лайт дверь-дверь","payer":"\"Чип Логик Плюс\" / Санкт-Петербург","weight":0.3,"revenue":0,"royalty":0,"summaPP":0,"extExpense":{"sum":0,"requestExists":false},"refund":0,"comission":0,"claim":-3450,"common":-3450,"storno":false},{"orderId":110832648,"check":false,"subdivision":{"code":"411","name":"Санкт-Петербург (На Проспекте Просвещения)"},"organization":{"code":"272","name":"ООО \"С-ЭСТЕЙТ\""},"orderDate":"06.07.2019","dateDD":"04.09.2019","numberOrd":1128520683,"cityFrom":"Санкт-Петербург","cityTo":"Тула","tariff":"Посылка склад-склад","payer":"\"ВЕЛОМЕХАНИКА\" / Санкт-Петербург","weight":0.4,"revenue":212.93,"royalty":21.29,"summaPP":0,"extExpense":{"sum":0,"requestExists":false},"refund":0,"comission":0,"claim":0,"common":21.29,"storno":false},{"orderId":112782491,"check":false,"subdivision":{"code":"411","name":"Санкт-Петербург (На Проспекте Просвещения)"},"organization":{"code":"272","name":"ООО \"С-ЭСТЕЙТ\""},"orderDate":"21.07.2019","numberOrd":15182203,"cityFrom":"Санкт-Петербург","cityTo":"Айхал","tariff":"Экспресс лайт склад-дверь","payer":"Игнатенко Илья Дмиттриевич / Санкт-Петербург","weight":7.306,"revenue":0,"royalty":0,"summaPP":0,"extExpense":{"sum":0,"requestExists":false},"refund":0,"comission":0,"claim":-4500,"common":-4500,"storno":false}],"foundCount":1924,"maxAvailableCount":1000}


Имеется такая попытка в коде

Pascal
1
2
3
4
5
6
7
uses TypInfo,fpjson,jsonparser;
 
jData :=GetJSON(temp);
jItem:=jData.FindPath('Items');
 
for i := 0 to jItem.Count-1 do
showmessage(TJSONObject(jItem).Names[i]);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2019, 16:46
Ответы с готовыми решениями:

Извлечь инфу с данных
здравствуйте, работаю в Ворде, есть в переменной а данные, например:...

Из параметра QLabel::paintEvent(QPaintEvent *event) какую инфу можно извлечь?
Здравствуйте. Переопределяю: void МойLabel::paintEvent(QPaintEvent *ev) // производный от QLabel...

Как извлечь данные из JSON
На сайте wordpress c использованием плагина woocomerce в момент фармирования заказа я получаю...

Извлечь json из html файла
Помогите. Есть html страничка в ней куча тегов и есть теги "script" в одном из таких тегов есть...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
04.09.2019, 21:20 2
Лучший ответ Сообщение было отмечено Moneo как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  jData : TJSONData;
  jArr : TJSONArray;
  i : Integer;
begin
  jData := GetJSON(ReadFileToString('my.json'));
  jArr := jData.FindPath('items') as TJSONArray;
  for i := 0 to Pred(TJSONData(jArr).Count) do
  begin
    Memo1.Lines.Add(Format('%s: %s', [TJSONObject(jArr[i]).Names[0], jArr[i].FindPath('orderId').AsString]));
  end;
end;
прекрасно возвращает все три orderId:
Код
orderId: 110680291
orderId: 110832648
orderId: 112782491
Дальше разберешься?
1
0 / 0 / 1
Регистрация: 14.04.2013
Сообщений: 36
04.09.2019, 21:22  [ТС] 3
Да, класс, спасибо. А по поводу скорости что скажете, это быстрее чем операции над строками?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
04.09.2019, 21:24 4
Разумеется, быстрее.
0
0 / 0 / 1
Регистрация: 14.04.2013
Сообщений: 36
05.09.2019, 12:19  [ТС] 5
Цитата Сообщение от volvo Посмотреть сообщение
Разумеется, быстрее.
Можете попробовать, почему-то из items массива не вытягивает параметр "dateDD" ни под каким соусом, выкидывает ошибку. Ниже данные на которых пробую.
JSON

JSON
1
{"alerts":[],"items":[{"orderId":110680291,"check":false,"subdivision":{"code":"411","name":"Санкт-Петербург (На Проспекте Просвещения)"},"organization":{"code":"272","name":"ООО \"С-ЭСТЕЙТ\""},"orderDate":"05.07.2019","dateDD":"06.08.2019","numberOrd":1128374238,"cityFrom":"Санкт-Петербург","cityTo":"Москва","tariff":"Экспресс лайт дверь-дверь","payer":"\"Чип Логик Плюс\" / Санкт-Петербург","weight":0.3,"revenue":0,"royalty":0,"summaPP":0,"extExpense":{"sum":0,"requestExists":false},"refund":0,"comission":0,"claim":-3450,"common":-3450,"storno":false},{"orderId":110832648,"check":false,"subdivision":{"code":"411","name":"Санкт-Петербург (На Проспекте Просвещения)"},"organization":{"code":"272","name":"ООО \"С-ЭСТЕЙТ\""},"orderDate":"06.07.2019","dateDD":"04.09.2019","numberOrd":1128520683,"cityFrom":"Санкт-Петербург","cityTo":"Тула","tariff":"Посылка склад-склад","payer":"\"ВЕЛОМЕХАНИКА\" / Санкт-Петербург","weight":0.4,"revenue":212.93,"royalty":21.29,"summaPP":0,"extExpense":{"sum":0,"requestExists":false},"refund":0,"comission":0,"claim":0,"common":21.29,"storno":false},{"orderId":112782491,"check":false,"subdivision":{"code":"411","name":"Санкт-Петербург (На Проспекте Просвещения)"},"organization":{"code":"272","name":"ООО \"С-ЭСТЕЙТ\""},"orderDate":"21.07.2019","numberOrd":15182203,"cityFrom":"Санкт-Петербург","cityTo":"Айхал","tariff":"Экспресс лайт склад-дверь","payer":"Игнатенко Илья Дмиттриевич / Санкт-Петербург","weight":7.306,"revenue":0,"royalty":0,"summaPP":0,"extExpense":{"sum":0,"requestExists":false},"refund":0,"comission":0,"claim":-4500,"common":-4500,"storno":false}],"foundCount":1924,"maxAvailableCount":1000}
JSON
1
 
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
05.09.2019, 12:35 6
А ничего, что не во всех нодах этого JSON-а есть поле dateDD? Значит, надо проверять, найдено ли что-нибудь через FindPath. и выводить только тогда, когда найдено. Например:

Pascal
1
2
3
4
5
6
  for i := 0 to Pred(TJSONData(jArr).Count) do
  begin
    jObj := jArr[i].FindPath('dateDD');
    if Assigned(jObj) then
      Memo1.Lines.Add(Format('%s: %s', [TJSONObject(jArr[i]).Names[5], jObj.AsString]));
  end;
0
0 / 0 / 1
Регистрация: 14.04.2013
Сообщений: 36
05.09.2019, 12:42  [ТС] 7
Если параметр который стоит в FindPath не найден, то выкидывает ошибку, как от этого избавиться?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
05.09.2019, 12:43 8
Лучший ответ Сообщение было отмечено Moneo как решение

Решение

Я написал выше, как. Сначала пробовать получить значение, и если вернулся НЕ nil - то обрабатывать результат. Если nil - то ничего не было найдено.
1
0 / 0 / 1
Регистрация: 14.04.2013
Сообщений: 36
05.09.2019, 13:49  [ТС] 9
Спасибо, не додумался таким образом, думал у json библы есть проверка есть путь или нет .
0
05.09.2019, 13:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2019, 13:49
Помогаю со студенческими работами здесь

Извлечь определенные строки из JSON-файла
Помогите с кодом для извлечения динамических параметров 183399677,183399680,183399717 в массив,...

Подскажите как извлечь данные из JSON массива?
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ...

Json api twitch: извлечь в массив значения ключа name.
http://jsfiddle.net/gfj8nx17/ <div id="player"></div> $(document).ready(function () { var...

Извлечь значение url из ответ от сервера в формате JSON
Здравствуйте! Никак не могу освоить написание паттернов для Regex, а задачу решить всё же надо. Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru