Перейти к содержанию
Fire Monkey от А до Я
  • 0

Парни помогите распарсить


Александр2010

Вопрос

Парин помогите распарсить вот это а то всю голову сломал(

 

{
  "request": {
    "people_count": 2,
    "id": 66,
    "order": null,
    "price": null,
    },
    "distance": {
      "price_1": 90,
      "price_2": 80,
      "price_3": 70,
      "price_4": 60,
      "id": 12,
      "from_polygon_id": 20,
      "fromPolygonName": "ВОСТОЧНАЯ КОМ ЗОНА",
      "to_polygon_id": 18,
      "toPolygonName": "16 район"
    },
    "status": 10,
    "from_cord": null,
    "to_cord": null
  }
}

получаю вот так

 Answerreqest := IdHTTP.Get('http://api.taxi.show.amberproduct.com/v1/request/info?token='+tokenkey+'&request_id='+idrequest+''); // Записываем ответ в answer

ответ приведен выше

HELP всю голову сломал уже пробовал как у (ZuBy)

var
  aJSValue: TJSONValue;
  aJSObject, aJSObjArr: TJSONObject;
  aJSArray: TJSONArray;
  I: integer;
begin
  Result := false;
  aJSValue := TJSONObject.ParseJSONValue(Answerreqest) as TJSONValue;
  if Assigned(aJSValue) then
  begin
    aJSObject := aJSValue as TJSONObject;
    TabbedForm.memo3.Lines.Add('request: ' + aJSObject.GetValue('request').Value);

    if aJSObject.GetValue('request').Value = '' then     // до сюда отрабатывает я получаю в мемо пустое сообщение
    begin
      Result := true;
      if Assigned(aJSObject) then
      begin
        aJSArray := aJSObject.GetValue('distance') as TJSONArray;     // дальше хочу полчить хоть 1 элемент json но даже не ругается просто  request
        if Assigned(aJSArray) then
        begin
          Result := true;
          TabbedForm.memo3.Lines.Add('price_1: ' + aJSObject.GetValue('price_1').Value);
          TabbedForm.memo3.Lines.Add('count: ' + aJSArray.Count.ToString);
          for I := 0 to aJSArray.Count - 1 do
          begin
            aJSObjArr := aJSArray.Items as TJSONObject;
            if Assigned(aJSObjArr) then
            begin
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' +
                aJSObjArr.GetValue('obj_cat_id').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_title').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_descr').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_address').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_url').Value);
            end;
          end;
        end;
      end;
    end;
    aJSValue.Free;
  end;
end;

Изменено пользователем Andrey Efimov
Поправил заголовок и удалил пустое место
Ссылка на комментарий

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

  • 0
5 часов назад, Александр2010 сказал:

      aJSArray := aJSObject.GetValue('distance') as TJSONArray;     // дальше хочу полчить хоть 1 элемент json но даже не ругается просто  request

ни одного TJSONArray в ответе нет
так же нет ничего из этого:

TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' +
                aJSObjArr.GetValue('obj_cat_id').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_title').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_descr').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_address').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_url').Value);

бросай те вы уже эти  as TJSONArray as TJSONObject - где проверки на существование? жесткого приведения требует только разве что TJSONArray, а остальное выше TJSONValue приводить не обязательно.
используйте нотацию TJSONValue.GetValue<string>('obj_title','').- не найдено встанет значение по умолчанию... не нравится возьми TryGetValue
даже jpath(указание пути названий узлов) работает JSONValue.GetValue<integer>('
request.people_count,0)  - даже с массивами...
касаемо массивов - можно указать тип искомой ноды SONValue.GetValue<TJSONArray>('
request.distance',nil)

Ссылка на комментарий
  • 0
32 минуты назад, Slym сказал:

ни одного TJSONArray в ответе нет
так же нет ничего из этого:


TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' +
                aJSObjArr.GetValue('obj_cat_id').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_title').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_descr').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_address').Value);
              TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_url').Value);

бросай те вы уже эти  as TJSONArray as TJSONObject - где проверки на существование? жесткого приведения требует только разве что TJSONArray, а остальное выше TJSONValue приводить не обязательно.
используйте нотацию TJSONValue.GetValue<string>('obj_title','').- не найдено встанет значение по умолчанию... не нравится возьми TryGetValue
даже jpath(указание пути названий узлов) работает JSONValue.GetValue<integer>('
request.people_count,0)  - даже с массивами...
касаемо массивов - можно указать тип искомой ноды SONValue.GetValue<TJSONArray>('
request.distance',nil)

Подскажи пожалуйста на моем примере как сделать чтобы получит каке то данные а то я просто пока не доганю всей механи процесса

Ссылка на комментарий
  • 0

function Proc(const Answerreqest:string):boolean;
var
  JSON,AItem: TJSONValue;
  JRequest, JDistance: TJSONObject;
  JArray: TJSONArray;
  I: integer;
begin
  JSON := TJSONObject.ParseJSONValue(Answerreqest);
  //if not Assigned(JSON) then exit(false); //<<< прикинь даже не обязательно проверять на nil :) JPath работает через FindValue - а он сам проверяет на nil
  try
    if JSON.TryGetValue<TJSONObject>('request',JRequest) then
      TabbedForm.memo3.Lines.Add('JRequest: ' + JRequest.ToString);

    if JSON.TryGetValue<TJSONObject>('distance',JDistance) then
    begin
      TabbedForm.memo3.Lines.Add('JDistance: ' + JDistance.ToString);
      TabbedForm.memo3.Lines.Add('price_1: ' + JDistance.GetValue<string>('price_1',''));
      if JDistance.TryGetValue<TJSONArray>('SomeArray',JArray) then
      begin
        TabbedForm.memo3.Lines.Add('count: ' + JArray.Count.ToString);
        for I := 0 to JArray.Count - 1 do
        begin
          AItem := JArray.Items;

          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_id','') + ',' +
                                     AItem.GetValue<string>('obj_acc_id','') + ',' +
                                     AItem.GetValue<string>('obj_cat_id',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_title',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_descr',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_address',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_url',''));
        end;
      end;
    end;
  finally
    JSON.Free;
  end;
  result:=true;
end;

Ссылка на комментарий
  • 0
14 часов назад, Slym сказал:

  JSON := TJSONObject.ParseJSONValue(Answerreqest);
  //if not Assigned(JSON) then exit(false); //<<< прикинь даже не обязательно проверять на nil :) JPath работает через FindValue - а он сам проверяет на nil
  try
    if JSON.TryGetValue<TJSONObject>('request',JRequest) then

Что, серьезно?)

Ссылка на комментарий
  • 0
8 часов назад, Tumaso сказал:

Что, серьезно?)

Также серьезно как и TObject(nil).Free; //no problem
Это работает! Поверь и проверь.
В любом вызове метода объекта передается первым параметром self, и достаточно сделать в самом начале if self=nil then exit; - и проблемы нет
так делает TJSONValue.FindValue, так делает TObject.Free
пример из генофонда:
 

procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;

 

Изменено пользователем Slym
Ссылка на комментарий
  • 0
В 28.11.2019 в 08:00, Slym сказал:

function Proc(const Answerreqest:string):boolean;
var
  JSON,AItem: TJSONValue;
  JRequest, JDistance: TJSONObject;
  JArray: TJSONArray;
  I: integer;
begin
  JSON := TJSONObject.ParseJSONValue(Answerreqest);
  //if not Assigned(JSON) then exit(false); //<<< прикинь даже не обязательно проверять на nil :) JPath работает через FindValue - а он сам проверяет на nil
  try
    if JSON.TryGetValue<TJSONObject>('request',JRequest) then
      TabbedForm.memo3.Lines.Add('JRequest: ' + JRequest.ToString);

    if JSON.TryGetValue<TJSONObject>('distance',JDistance) then
    begin
      TabbedForm.memo3.Lines.Add('JDistance: ' + JDistance.ToString);
      TabbedForm.memo3.Lines.Add('price_1: ' + JDistance.GetValue<string>('price_1',''));
      if JDistance.TryGetValue<TJSONArray>('SomeArray',JArray) then
      begin
        TabbedForm.memo3.Lines.Add('count: ' + JArray.Count.ToString);
        for I := 0 to JArray.Count - 1 do
        begin
          AItem := JArray.Items;

          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_id','') + ',' +
                                     AItem.GetValue<string>('obj_acc_id','') + ',' +
                                     AItem.GetValue<string>('obj_cat_id',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_title',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_descr',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_address',''));
          TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_url',''));
        end;
      end;
    end;
  finally
    JSON.Free;
  end;
  result:=true;
end;

 

 

Привет у меня не работает((

Если брать твой пример то ругается на   AItem := JArray.Items;   /// я что то не нашел строки где мы что то туда загоняем(

Помоги пож распарсить вот такой пример а то уткнулся и что то прям беда(

{
  "request": {
    "people_count": 2,
    "id": 66,
    "order": null,
    "price": null,
    },
    "distance": {
      "price_1": 90,
      "price_2": 80,
      "price_3": 70,
      "price_4": 60,
      "id": 12,
      "from_polygon_id": 20,
      "fromPolygonName": "ВОСТОЧНАЯ КОМ ЗОНА",
      "to_polygon_id": 18,
      "toPolygonName": "16 район"
    },
    "status": 10,
    "from_cord": null,
    "to_cord": null
  }
}

 

Можешь показать на этом примере как что отсюда достать ?

 

 

В 28.11.2019 в 08:00, Slym сказал:

 

 

 

 

 

 

 

 

 

 

 

 

Ссылка на комментарий
  • 0

а бездумно копипастить вредно. форум режет скобки... JArray.Items [ i ];
приведенный код не соответствует тексту JSON... нету в тексте Array (обозначается [ ])

Изменено пользователем Slym
Ссылка на комментарий
  • 0
В 27.11.2019 в 23:59, Александр2010 сказал:

Парин помогите распарсить вот это а то всю голову сломал

Так всё для вас уже сделано, даже голову ломать не надо не надо ?

 

Ссылка на комментарий
  • 0
15 часов назад, Александр2010 сказал:

Можешь показать на этом примере как что отсюда достать ?

Подставляете туда свой JSON и получаете готовый результат. 

Ссылка на комментарий
  • 0
6 часов назад, Slym сказал:

а бездумно копипастить вредно. форум режет скобки... JArray.Items [ i ];
приведенный код не соответствует тексту JSON... нету в тексте Array (обозначается [ ])

Спасибо большое да в итоге методом тыка разобрался! Именно тыка) Помогли примеры на этом форуме

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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