• 0
Просто Проги

Неполучается получить элемент из 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;

но летят ошибка критичная (

Изменено пользователем Andrey Efimov
добавил тег "код"

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


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

10 ответов на этот вопрос

  • 0

используйте XSuperObject, код будет такой

procedure TForm4.Button1Click(Sender: TObject);
// uses XSuperObject;
var
  xResp, xObj: ISuperObject;
  xItems: ISuperArray;
  j: Integer;
begin
  xResp := so(Memo1.Text);
  xItems := xResp.O['Response'].A['Items'];

  for j := 0 to xItems.Length - 1 do
  begin
    xObj := xItems.O[j];
    with ListView1.Items.Add do
    begin
      Text := xObj.S['first_name'] + ' ' + xObj.S['last_name'];
    end;
  end;
end;

 

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


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

Спасибо, но я пробую сделать так получаю id и другие поля но только одной записи как получить все не

поидее должно же здесь быть значение стрпоки которая парсится

JS   := TJSONObject.ParseJSONValue(JSAr.Items[i].ToString) as TJSONObject; i -это индекс троки но почему то не выходит((

var
  JS : TJSONObject;
  JSAr : TJSONArray;
  s  : string;
  i:integer;
begin
 

  JS := TJSONObject.ParseJSONValue(Memo2.Text) as TJSONObject;
  if Assigned(JS) then
  begin
    JS := TJSONObject.ParseJSONValue(JS.GetValue('response').ToString) as TJSONObject;
    JSAr := TJSONObject.ParseJSONValue(JS.GetValue('items').ToString) as TJSONArray;
    JS   := TJSONObject.ParseJSONValue(JSAr.Items[i].ToString) as TJSONObject;

    Form2.Memo1.Lines.Clear;
    for i := 0 to  10 do
    begin
    Memo2.Lines.Add('id: ' + JS.GetValue('id').Value);

    end;
    JS.Free;
  end; 

 

Изменено пользователем Просто Проги

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


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

ок, у вас ошибка тут

JS := TJSONObject.ParseJSONValue(JSAr.Items[0].ToString) as TJSONObject;

это массив данных, вам нужно было указать какой элемент вы хотите получить

Изменено пользователем ZuBy

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


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

исправил но парсится так

id: 4680345
first_name: Наталья
last_name: Никитина
photo_100: https://vk.com/images/deactivated_100.png
id: 4680345
first_name: Наталья
last_name: Никитина
photo_100: https://vk.com/images/deactivated_100.png
id: 4680345
first_name: Наталья
last_name: Никитина
photo_100: https://vk.com/images/deactivated_100.png
id: 4680345
first_name: Наталья
last_name: Никитина
photo_100: https://vk.com/images/deactivated_100.png
id: 4680345
first_name: Наталья
last_name: Никитина
photo_100: https://vk.com/images/deactivated_100.png
id: 4680345

цикл работает но одно и тоже парсит (

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


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

вот исправленный код
 

var
  JS : TJSONObject;
  JSAr : TJSONArray;
  s  : string;
  i:integer;
begin
  s := Memo2.Text;

  JS := TJSONObject.ParseJSONValue(s) as TJSONObject;
  if Assigned(JS) then
  begin
    JS := TJSONObject.ParseJSONValue(JS.GetValue('response').ToString) as TJSONObject;
    JSAr := TJSONObject.ParseJSONValue(JS.GetValue('items').ToString) as TJSONArray;
    JS   := TJSONObject.ParseJSONValue(JSAr.Items[0].ToString) as TJSONObject;

    Form2.Memo1.Lines.Clear;
    for i := 0 to JSAr.Count - 1 do
    begin
    Memo2.Lines.Add('id: ' + JS.GetValue('id').Value);
    Memo2.Lines.Add('first_name: ' + JS.GetValue('first_name').Value);
    Memo2.Lines.Add('last_name: ' + JS.GetValue('last_name').Value);
    Memo2.Lines.Add('photo_100: ' + JS.GetValue('photo_100').Value);

    end;
    JS.Free;
  end;

только теперь я беру из массива JSar что бы все вывести записи но один фиг их больше но все под одним значением

Изменено пользователем Просто Проги

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


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

ай-яй-яй

var
  JS : TJSONObject;
  JSAr : TJSONArray;
  s  : string;
  i:integer;
begin
  s := Memo2.Text;

  JS := TJSONObject.ParseJSONValue(s) as TJSONObject;
  if Assigned(JS) then
  begin
    JS := TJSONObject.ParseJSONValue(JS.GetValue('response').ToString) as TJSONObject;
    JSAr := TJSONObject.ParseJSONValue(JS.GetValue('items').ToString) as TJSONArray;

    Form2.Memo1.Lines.Clear;
    for i := 0 to JSAr.Count - 1 do
    begin
	JS   := TJSONObject.ParseJSONValue(JSAr.Items[i].ToString) as TJSONObject; // внутри цикла нужно 
	Memo2.Lines.Add('id: ' + JS.GetValue('id').Value);
    Memo2.Lines.Add('first_name: ' + JS.GetValue('first_name').Value);
    Memo2.Lines.Add('last_name: ' + JS.GetValue('last_name').Value);
    Memo2.Lines.Add('photo_100: ' + JS.GetValue('photo_100').Value);

    end;
    JS.Free;
  end;

 

Изменено пользователем ZuBy
изменил код

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


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

щя опробую) блин точно я же в начале делаю JS   := TJSONObject.ParseJSONValue(JSAr.Items[0].ToString) as TJSONObject;

а уже в цикле и вывожу её!  а надо то в цикле засунуть было! всё надо спать идти)

 

Изменено пользователем Просто Проги

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


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

фигасе XSuperObject,  это классно и кода меньше только не совсем понятно что в этой строке происходит

xItems := xResp.O['Response'].A['Items'];
xItems это типа объект весь json
xResp.о это респонсе потом идет сразу a итемс а как до count достучаться ?   так что ли xItems := xResp.O['Response'].A['count'];
и почему o и  a вообще просто первый раз с такой штуко работаю)
 "response": {
        "count": 104,
        "items": [

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, Просто Проги сказал:

так что ли xItems := xResp.O['Response'].A['count'];

memo2.Lines.Add( xResp.O['Response'].I['count'].ToString );

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

    • От ENERGY
      Друзья, нашел тут интересную статью, где тестируются разные jSON парсеры.
       
      Ссылка: http://www.webdelphi.ru/2016/10/ishhem-samyj-bystryj-parser-json-v-delphi/
      Автор: Владислав Баженов
      Описание (26/10/2016):
       
    • От unicorn
      Всем привет. 
      Мне нужно отправить запрос к серверу в формате JSON-RPC. Вопрос - как в него запихнуть json-данные правильно?
    • От 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 перед спец символами. Как от этого избежать?
    • От Syb
      Я могу совсем что то не правильно делать, хочу получить данные согласно API :
       
       
      http://glonasssoft.ru/wiki/?wiki_name=API
      var jValue:TJSONValue; s,s1:string; begin RestClient1.BaseURL:='http://dev.glonasssoft.ru/auth/login'; Restrequest1.Execute; jValue:=RESTResponse1.JSONValue; s:=jValue.ToString; s1:= copy(s,pos('AuthID:"',s)+11,pos('","U',s)-pos('AuthID:"',s)-11);//достал ключ RestClient2.BaseURL:='http://dev.glonasssoft.ru/vehicles_'; Restrequest2.Params[0].Value:=s1; -здесь параметр типа HttpHeader задан X-Auth в него сую ключ Restrequest2.Execute; - говорит не авторезирован jValue:=RESTResponse2.JSONValue; s:=jValue.ToString; что я не так делаю?
    • От Равиль Зарипов (ZuBy)
      Привет Всем!
       
      Решил поделится впечатлениями по работе с 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
    • От rareMax
      Необходимо распарсить JSON в котором есть массив. Искал в интернете - но там для сторонних библиотек. 
      Вот сам объект в котором есть массив:
      { "Version": "1", "Charset": "UTF-8", "Variables": { "cookiepre": "1ati_2132_", "auth": "2ab39ybBCy0KypS2Sh6Ey5facuaHGKSG/9uhrV0JHzcirqQX+fl2nFUErSIpvOwZJuGURxqrJ9arNTPGkIiZ", "saltkey": "C6bK667j", "member_uid": "3", "member_username": "Maximum", "groupid": "2", "formhash": "e2b42ccc", "ismoderator": null, "readaccess": "150", "notice": { "newpush": "0", "newpm": "0", "newprompt": "0", "newmypost": "0" }, "list": [ { "uid": "5", "username": "Player" }, { "uid": "12", "username": "RaR" }, { "uid": "29", "username": "prlzrak" }, { "uid": "63", "username": "Leemur" } ], "count": "4" } } Вот тут мне надо помощь с парсингом list.
  • Последние посетители   0 пользователей онлайн

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