Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Decodificar objeto json. (https://www.clubdelphi.com/foros/showthread.php?t=88352)

lbidi 25-05-2015 17:30:40

Decodificar objeto json.
 
Estimados.

Tengo el siguiente array en formato json y necesito parsearlo o decodificar.

Código Delphi [-]
{"username":"155555" , "fecha_nacimiento": "2015-02-26" , '"ci": "18272617", "password":"", "telefono":"", "email":"", "direccion":"" }

Estoy usando XE5, mientras sigo probando.

Gracias.

duilioisola 26-05-2015 09:24:39

Podrías hacer un bucle que busque las cadenas entre llaves.
En esa cadena busca las subcadenas separadas por comas.
De esa cadena busca las cadenas entre "dos puntos"
Quitas las comillas a las cadenas
La primera es el nombre del campo y la segunda es el valor.

También puedes recorrer de izquierda a derecha buscando comillas.
Teniendo en cuenta que siempre son pares, la primera parte es el nombre del campo y la segunda el valor.

Neftali [Germán.Estévez] 26-05-2015 10:19:12

Las ultimas versiones de Delphi poseen la unit System.JSON (ahora no recuerdo si se introdujo en XE5 o XE6).
Con ella puedes parsear fácilmente objetos de tipo JSON. Si le echas un vistazo a la docWiki seguro que hay ejemplos de cómo hacerlo.

Si en la versión que tienes no está, la opción es usar una unit externa. Yo, por ejemplo, he usado lkJSON (búscala por Internet) que funciona muy bien.

Librería lklJSON en Sourceforge

nlsgarcia 27-05-2015 05:34:03

lbidi,

Cita:

Empezado por lbidi
...Tengo el siguiente array en formato json y necesito parsearlo...

:rolleyes:

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uLkJSON;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Read and Parse File JSON
procedure TForm1.Button1Click(Sender: TObject);
var
   SL, FieldList : TStringList;
   JS : TlkJSONobject;
   i : Integer;

begin

   SL := TStringList.Create;
   SL.LoadFromFile(ExtractFilePath(Application.ExeName) + 'FileTest.json');

   FieldList := TStringList.Create;

   JS := TlkJSONobject.Create;
   JS := TlkJSON.ParseText(SL.Text) as TlkJSONobject;

   for i := 0 to JS.Count - 1 do
   begin
      if JS.FieldByIndex[i].SelfType <> jsNull then
        FieldList.Add(JS.FieldByIndex[i].Value)
      else
        FieldList.Add(' ');
   end;

   ListBox1.Clear;
   for i := 0 to FieldList.Count - 1 do
      ListBox1.Items.Add(FieldList.Strings[i]);

   SL.Free;
   FieldList.Free;
   JS.Free;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Lee y analiza la estructura de un archivo .json (Msg #1) por medio de la librería lkJSON-1.07, como se muestra en la siguiente imagen:



Nota: La librería lkJSON-1.07, no necesita ser instalada, solo se debe copiar la unidad uLkJSON.pas al directorio del proyecto o agregar la ruta de la misma en el Library Path de Delphi.

Espero sea útil :)

Nelson.

nlsgarcia 27-05-2015 08:01:57

lbidi,

Cita:

Empezado por lbidi
...Tengo el siguiente array en formato json y necesito parsearlo...

:rolleyes:

Revisa este código:
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;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Read and Parse File JSON
procedure TForm1.Button1Click(Sender: TObject);
var
   SL, FieldList : TStringList;
   JS : TJSONObject;
   i : Integer;

begin

   SL := TStringList.Create;
   SL.LoadFromFile(ExtractFilePath(Application.ExeName) + 'FileTest.json');

   FieldList := TStringList.Create;

   JS := TJSONobject.Create;
   JS.Parse(BytesOf(SL.Text), 0);

   for i := 0 to JS.Count - 1 do
      FieldList.Add(JS.Pairs[i].JsonString.Value + ': ' + JS.Pairs[i].JsonValue.Value);

   ListBox1.Clear;
   for i := 0 to FieldList.Count - 1 do
      ListBox1.Items.Add(FieldList.Strings[i]);

   SL.Free;
   FieldList.Free;
   JS.Free;

end;

end.
El código anterior en Delphi XE7 sobre Windows 7 Professional x32, Lee y analiza la estructura de un archivo .json (Msg #1) por medio de la unidad System.JSON, como se muestra en la siguiente imagen:



Espero sea útil :)

Nelson.

lbidi 29-05-2015 14:34:06

Muchas gracias nlsgarcia..

Me ha sido muy util.

amadis 12-08-2015 01:34:35

Que tal Amigos.

Quisiera saber si ese codigo de delphi XE7 funciona en XE5?.

yo lo he intentado y me está dando error al compilar.

[dcc32 Fatal Error] jsonsimple.pas(7): F1026 File not found: 'D:\Mis Documentos\RAD Studio\Projects\System.json.dcu' (unit scope "System" indicates Android, iOSDevice, Win32, Win64, OSX32, iOSSimulator only)

En otras pruebas que hice con JSON he usado la UNIT DBXjson y no tuve problemas pero ya al declarar la uses System.Json me marca error de sintaxis.

Será posible lograr lo mismo en XE5 sin componentes de terceros?.

Gracias

AgustinOrtu 12-08-2015 07:13:08

Quiere decir que no estaba la unit System.Json en XE 5

Fijate sino con REST.Json, aunque no estoy seguro si es exactamente la misma funcionalidad

Por otro lado, si con la DBXJson no tuviste problemas porque cambiarla?

Precisamente no recuerdo ahora si fue en StackOverflow o en el grupo de Google+ que lei que las implementaciones mas recientes que vienen en Delphi (System.Json y REST.Json) son algo flojas

amadis 12-08-2015 12:40:15

Hola Agustín.

Aparantemente en las unit dbxjson o rest.json no estan las siguientes propiedades implementadas.

JS.Count JS.Pairs[].

Que vi en el ejemplo de este mismo post para acceder y visualizar los datos de un Json.

amadis 12-08-2015 13:49:02

Por sugerencia del compañero Neftali he descargado la unit uLKJSON y lo he resuelto de esa forma.

AgustinOrtu 12-08-2015 22:36:58

Otra opcion muy buena es SuperObjects


La franja horaria es GMT +2. Ahora son las 15:24:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi