Перейти к содержанию
  • 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
добавил тег "код"

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


Ссылка на сообщение

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

  • 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 );

 

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


Ссылка на сообщение

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

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

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

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

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

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

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

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


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

    • От rareMax
      Нужно сериализовать объект. Проблема в том, что бы поля, значения которых nil - нужно вообще исключить из итогового JSON. Использую System.Json.Serializers. Пробовал сделать это через свой IJsonContractResolver - но там я не смог проверить значение. Знаю что можно свой конвертер для каждого типа написать - но это довольно объемная работа получится. Есть ли у вас варианты, как можно решить мой вопрос?
      JSON-Serialize-Experiments/IgnoreIfNil.dpr at main · ms301/JSON-Serialize-Experiments (github.com)
    • От rareMax
      Как убрать поле класса из сериализации через Rest.Json?
      Вот как я пробую избавиться от поля Foo:
      program Project1; {$APPTYPE CONSOLE} {$R *.res} uses REST.Json, System.JSON.Serializers, System.SysUtils; type TFoo = class private FValue1: Integer; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; end; [JsonSerialize(TJsonMemberSerialization.&Public)] TBar = class private FValue1: Integer; FFoo: TFoo; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; // property Foo: TFoo read FFoo write FFoo; end; procedure Test; var LBar: TBar; begin LBar := TBar.Create; try Writeln(TJson.ObjectToJsonString(LBar)); finally LBar.Free; end; end; begin try { TODO -oUser -cConsole Main : Insert code here } Test; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Но на выходе все равно есть поле Foo.
       
    • От 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; что я не так делаю?
  • Последние посетители   0 пользователей онлайн

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

×
×
  • Создать...