Ir al contenido


Foto

Delphi Leer elementos de un JSON


  • Por favor identifícate para responder
2 respuestas en este tema

#1 tiquinho

tiquinho

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 01 agosto 2020 - 03:28

Hola a todos

 

Resulta que me conecto a un servicio y obtengo una respuesta JSON, dependiendo de lo que envíe obtengo la respuesta:

 

Algunos ejemplos:

 

{
    "estado": "Exito",
    "idUsuario": 232,
    "usuario": "Alberto",
    "idEmpresa": 214,
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJpYXQiOjE1OTYzMTI1MDIsInJvbGVzIjpbeyJfX2luaXRpYWxpemVyX18iOnt9LCJfX2Nsb25lcl9fIjp7fSwiX19pc0luaXRpYWxpemVkX18iOmZhbHNlfV0sInVzZXJuYW1lIjoiODkxNTAwNzM2LTAiLCJleHAiOjE1OTYzOTg5MDJ9.JSeGHifPm11pDQM19AC6ZNjiJXwPYAaRye2vmvQ597Y37_R96xR0A_mOUKZbjzkf-SMQMuvmEZDq2ydfU6ZlSbw4bbDU0qAryDMW9hwwaikk5GbB5xGEYNiq6DNDswKQ1G98VG0_8Zg8DlqCjJ4yf8NFqhnq7y78ASsomZJF2SDq1Z-k9lyn5rAkuNwDlFd2V4UXjPyGUMOsUnfEdFBub3dvcTVc8LmXXWkZENcDNbl2JQg2R7wSVN0vA9C1HwNVEkytYEIo7w4izsOI2XTas1nrBMYKprgCHfGBgrSH6qzfI79t8VWWv2n-xLEpISzLxx7psDqJy16bQZFIcubkQFjiEPWUWFHxmcJYTv2PMVT_HbSBNcFT-SNSZPfFJmOmqL3SKS2lal-Pgvx0ff8xUktwQJf9MvRAnTsqRLkLjh9YjtjO7oUq8UcPCKojq-ymJNO2O7xNF4BeR5xCDEN_MErymt-ElG6PTAFM0AUMW2r8_wiqLHdmYof8SJArFO4k3gyORZutoqoS6TmAMwZYivl8iI7enEWG-8Fp4ckgqJwi7aefk1lD9cp2AO09NQ-iZy3K7Qn4MFO3NfJqN6AndDLmRIw9Vi6rrTIlVONM-2PgqOu6Y1v0piTqLHGEVxLwgcpbcg1E-zMOr_AY3MFyoPze2wAN6R6NyLJp8_iApNE"
}
 
 
Otro resultado
 
{
    "code": 401,
    "message": "Usuario y/o contraseña inválida"
}
    

otro resultado

 

{
    "estado": "Error",
    "mensaje": "No tiene autorización para registro de empresas."
}
 
otro resultado
 
{
    "Estado": "Error",
    "Mensaje": "La información del token no fue enviada correctamente.",
    "Entorno": "",
    "Errores": "",
    "XmlBase64": ""
}
 
otro resultado
 
{
    "Mensaje": "Error: Invalid format: \"\"",
    "Entorno": "Edocx",
    "Errores": {
        "JA-001": "Error: Invalid format: \"\""
    },
    "Estado": "Error"
}

 

 

Lo que necesito es leer el JSON y sacar las claves, dependieno al nombre ya puedo entrar a tomar el valor que necesito, ya que no puedo obtener la clave Estado cuando la clave puede ser Mensaje y ahí obtengo error.

 

Espero haberme hecho entender

 

 

Por ejemplo:

me retorna este JSON
{
    "code": 401,
    "message": "Usuario y/o contraseña inválida"
}
 
Entonces debo obtener code y mensaje. 
    

Pero si me retorna este

 

{
    "estado": "Error",
    "mensaje": "No tiene autorización para registro de empresas."
}

 

Obtengo estado y mensaje.

 

Por ende, si me devolvió code, se que hago otra acción diferente a si me devuelve estado.

 


  • 0

#2 tiquinho

tiquinho

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 01 agosto 2020 - 05:02

Bueno, me puse a cacharrear un rato y aquí lo hice

Si hay una manera más optima de hacerlo, se los agradecería.

Por si a alguien le sirve.

Delphi 10.3 community edition
Dos memos y dos botones en el formulario

 

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,System.JSON, sYSTEM.JSON.Types,
  System.JSON.Writers,System.JSON.Builders;

type


  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ParseJSonValue;

  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  StringWriter:TStringWriter;
  Writer:TJsonTextWriter;
  Builder : TJSONObjectBuilder;
  LJsonResponse: TJSONObject;

begin
  Memo1.Lines.Clear;

  StringWriter := TStringWriter.Create();
  writer := TJsonTextWriter.Create(StringWriter);
  Builder := TJSONObjectBuilder.Create(Writer);

  try
    Writer.Formatting := TJsonFormatting.Indented;

   Builder
      .BeginObject
        .Add('Estado','Error')
        .Add('Mensaje','La información del token no fue enviada correctamente.')
        .Add('Entorno','3')
        .Add('Errores','4')
        .Add('XmlBase64','5')
        .Add('message','6')
      .EndObject;

      Memo1.Lines.Add(StringWriter.ToString);

  finally

  end;
end;

procedure TForm1.Button2Click(Sender: TObject);

begin


   ParseJSonValue

end;



procedure TForm1.ParseJSonValue;
procedure ParseJson;
var
  LJsonObj  : TJSONObject;
  LJPair    : TJSONPair;
  LProducts : TJSONValue;
  LProduct  : TJSONValue;
  LProduct1  : TJSONValue;
  LItem     : TJSONValue;
  LIndex    : Integer;
  LSize     : Integer;
begin
    LJsonObj    := TJSONObject.ParseJSONValue(Memo1.Text) as TJSONObject;
  try
     LSize:= TJSONArray(LJsonObj).Size;
     for LIndex:=0 to LSize-1 do
     begin

      LProduct := TJSONArray(LJsonObj.Get(LIndex).JsonValue);
      LProduct1 := TJSONArray(LJsonObj.Get(LIndex).JsonString);

      LJPair   := TJSONPair(LProduct);
      Memo2.Lines.Add(StringReplace(LProduct1.ToString,'"','',[rfReplaceAll]));
      Memo2.Lines.Add(StringReplace(LJPair.ToString,'"','',[rfReplaceAll]));

     end;
  finally
     LJsonObj.Free;
  end;
end;

begin

    ParseJson;


end;

end.

  • 0

#3 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 560 mensajes
  • LocationEspaña

Escrito 03 agosto 2020 - 04:25

Gracias por compartir la solución

 

Saludos

 

(y)


  • 0