PDA

Ver la Versión Completa : Obtener elementos de un JSON en delphi


tiqui_loquito
01-08-2020, 23:35:48
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.eyJpYXQiOjE1OTYzMTI1MDIsInJvbGVzIjpbeyJfX2luaXRpYWxpemVyX18iOnt 9LCJfX2Nsb25lcl9fIjp7fSwiX19pc0luaXRpYWxpemVkX18iOmZhbHNlfV0sInVzZXJuYW1lIjoiODkxNTAwNzM2LTAiLCJleHA iOjE1OTYzOTg5MDJ9.JSeGHifPm11pDQM19AC6ZNjiJXwPYAaRye2vmvQ597Y37_R96xR0A_mOUKZbjzkf-SMQMuvmEZDq2ydfU6ZlSbw4bbDU0qAryDMW9hwwaikk5GbB5xGEYNiq6DNDswKQ1G98VG0_8Zg8DlqCjJ4yf8NFqhnq7y78ASsom ZJF2SDq1Z-k9lyn5rAkuNwDlFd2V4UXjPyGUMOsUnfEdFBub3dvcTVc8LmXXWkZENcDNbl2JQg2R7wSVN0vA9C1HwNVEkytYEIo7w4izsOI2XT as1nrBMYKprgCHfGBgrSH6qzfI79t8VWWv2n-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.

tiqui_loquito
02-08-2020, 01:06:18
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



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.

(MAJ)
05-08-2020, 18:39:43
Buenas compañero



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.



se me ocurre algo así




procedure ParseJSON;
var

JObject: TJsonObject;
JEstado: TJValue;
JCode: TJValue;
JMessage: TJValue

begin
JObject:= TJSONObject.ParseJSONValue(Memo1.text) as TJSONObject;


JEstado:= JObject.FindValue('estado');
JMessage:= JObject.FindValue('message');



if Assigned(JEstado) then
begin

Memo2.Text:= JEstado.Value' - '+JMessage.Value
end;

else
begin
JCode:= JObject.FindValue('code');
if Assigned(JCode) then
begin
Memo2.Text:= JCode.Value' - '+JMessage.Value;
end;

end;
end;




espero que te sirva, no se si es lo mejor pero creo que puede servirte