Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   uLkJSON con Delphi XE (https://www.clubdelphi.com/foros/showthread.php?t=95920)

StartKill 18-10-2022 18:24:42

uLkJSON con Delphi XE
 
Saludos al foro
A los años que me acerco al Club del conocimiento.

Tengo un aplicativo hecho en Delphi XE y necesito implementar una rutina en JSON, para ello estoy utilizando la unit uLkJSON.

Mas logro llevar al CDS con las tildes

Código Delphi [-]
//En un memo tengo estas líneas:

[
  {
    "id": 1,
   "nombre": "Pepíto Conejo",
    "edad": 25,
    "carnet": 1
  },
  {
    "id": 2,
    "nombre": "Ana Barbéro",
    "edad": 90,
    "carnet": 0
  }
]

procedure TForm24.Button1Click(Sender: TObject);
var
   sJSON: string;
   jl: TlkJSONlist;
   ja: TlkJSONobject;
   I: Integer;
begin
   ClientDataSet1.Open;
   ClientDataSet1.EmptyDataSet;
   sJSON := Memo1.Lines.Text;

   jl := TlkJSON.ParseText(sJSON) as TlkJSONlist;
   for I := 0 to jl.Count - 1 do
   begin
      ja := jl.child[i] as TlkJSONobject;
      ClientDataSet1.Insert;
      ClientDataSet1id.AsString := ja.Field['id'].Value;
      ClientDataSet1nombre.AsString := ja.getString('nombre');
       ClientDataSet1edad.AsInteger := ja.Field['edad'].Value;
      ClientDataSet1carnet.AsInteger := ja.Field['carnet'].Value;
      ClientDataSet1.Post;
   end;
end;

A la espera de su ayuda

Your friend

StartKill
Lima-Perú

Casimiro Notevi 18-10-2022 19:42:42

¿Y qué problema tienes?

StartKill 18-10-2022 19:48:44

Hola Foro, mi mala redacción hace que el foro ignore mi pregunta mal hecha

Tengo un aplicativo hecho en Delphi XE y necesito implementar una rutina en JSON, para ello estoy utilizando la unit uLkJSON.

Mas "NO" logro llevar al CDS con las tildes

A la espera de su ayuda

Your friend

StartKill
Lima-Perú

Casimiro Notevi 18-10-2022 20:05:10

Prueba algo similar a:
Código Delphi [-]
valor := AnsiToUtf8( valor );

StartKill 18-10-2022 20:21:36

Cita:

Empezado por Casimiro Notevi (Mensaje 548733)
Prueba algo similar a:
Código Delphi [-]
valor := AntiToUtf8( valor );

Gracias por responder, pero no tengo los resultados esperado

Tildes fallan uLkJSON con Delphi XE

Saludos

Sartkill

Casimiro Notevi 18-10-2022 21:04:04

¿Pero el "json" que lees está en utf8?

StartKill 18-10-2022 21:13:53

Cita:

Empezado por Casimiro Notevi (Mensaje 548736)
¿Pero el "json" que lees está en utf8?

El JSON que utilizo es un copy/paste dentro de un memoedit

[
{
"id": 1,
"nombre": "Pepíto Conejo",
"edad": 25,
"carnet": 1
},
{
"id": 2,
"nombre": "Ana Barbéro",
"edad": 90,
"carnet": 0
}
]

Casimiro Notevi 19-10-2022 09:14:01

¿Y si pasas la respuesta a texto?
Código Delphi [-]
obj := TlkJSON.ParseText(ssRespuesta.DataString);
¿Y si usas VarToStr?
Código Delphi [-]
cValor := VarToStr(TlkJSONobject(obj.Field['Nombre'].Field['Nombre']).Value);

Neftali [Germán.Estévez] 19-10-2022 10:07:01

El problema tal y como comenta [casimiro] es de codificación.
Al hacer un Copy&Paste del texto en el TMemo "perdemos", por decirlo así, la codificación que tiene el texto, porque el componente deja de conocerla, y luego al realizar el Parse la coge equivocada.
La forma de resolverlo es decirle en algún momento del proceso cual es la codificación que tiene ese texto o con cual queremos que la trate.

Una opción es usar el propio TMemo, pero cargar el texto de disco (en ese punto podemos forzar la codificación que queremos utilizar).
Con este código carga los textos correctamente:


Código Delphi [-]
...
var
   sJSON: string;
   jl: TlkJSONlist;
   ja: TlkJSONobject;
   I: Integer;
begin
   ClientDataSet1.Open;
   ClientDataSet1.EmptyDataSet;

   // Cargar el memo de disco y forzar codificacion
   memo1.Lines.DefaultEncoding := TEncoding.ANSI;
   Memo1.Lines.LoadFromFile('c:\Datos.dat', TEncoding.ANSI);
   sJSON := Memo1.Lines.Text;

   jl := TlkJSON.ParseText(sJSON) as TlkJSONlist;
   for I := 0 to jl.Count - 1 do
   begin
      ja := jl.child[i] as TlkJSONobject;
      ClientDataSet1.Insert;
      ...

Otra opción es cargar el texto usando Streams, forma habitual de cargar texto desde disco y que también permite especificar la codificación. Con un código como este también obtendrás los textos correctos:

Código Delphi [-]
...
var
   sJSON: string;
   jl: TlkJSONlist;
   ja: TlkJSONobject;
   I: Integer;
   datos:TStringStream;
begin
   ClientDataSet1.Open;
   ClientDataSet1.EmptyDataSet;

  // Cargar el texto de un foichero usando Streams
  datos := TStringStream.Create('', TEncoding.ANSI);
  try
    datos.LoadFromFile('c:\Datos.dat');
    sJSOn := datos.DataString;

     jl := TlkJSON.ParseText(sJSON) as TlkJSONlist;
     for I := 0 to jl.Count - 1 do
     begin
        ja := jl.child[i] as TlkJSONobject;
        ClientDataSet1.Insert;      
        ...

Con cualquiera de estas 2 fomas, obtendrás el código correcto, ahora si porque has indicado la codificación.


StartKill 19-10-2022 21:16:07

Saludos Casimiro, Neftali

Gracias por su tiempo en anlizar y responderme, revisaré con calma y les escribo

Ss

StartKill

StartKill 06-11-2022 00:47:16

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 548744)
El problema tal y como comenta [casimiro] es de codificación.
Al hacer un Copy&Paste del texto en el TMemo "perdemos", por decirlo así, la codificación que tiene el texto, porque el componente deja de conocerla, y luego al realizar el Parse la coge equivocada.
La forma de resolverlo es decirle en algún momento del proceso cual es la codificación que tiene ese texto o con cual queremos que la trate.

Una opción es usar el propio TMemo, pero cargar el texto de disco (en ese punto podemos forzar la codificación que queremos utilizar).
Con este código carga los textos correctamente:


Código Delphi [-]
...
var
   sJSON: string;
   jl: TlkJSONlist;
   ja: TlkJSONobject;
   I: Integer;
begin
   ClientDataSet1.Open;
   ClientDataSet1.EmptyDataSet;

   // Cargar el memo de disco y forzar codificacion
   memo1.Lines.DefaultEncoding := TEncoding.ANSI;
   Memo1.Lines.LoadFromFile('c:\Datos.dat', TEncoding.ANSI);
   sJSON := Memo1.Lines.Text;

   jl := TlkJSON.ParseText(sJSON) as TlkJSONlist;
   for I := 0 to jl.Count - 1 do
   begin
      ja := jl.child[i] as TlkJSONobject;
      ClientDataSet1.Insert;
      ...

Otra opción es cargar el texto usando Streams, forma habitual de cargar texto desde disco y que también permite especificar la codificación. Con un código como este también obtendrás los textos correctos:

Código Delphi [-]
...
var
   sJSON: string;
   jl: TlkJSONlist;
   ja: TlkJSONobject;
   I: Integer;
   datos:TStringStream;
begin
   ClientDataSet1.Open;
   ClientDataSet1.EmptyDataSet;

  // Cargar el texto de un foichero usando Streams
  datos := TStringStream.Create('', TEncoding.ANSI);
  try
    datos.LoadFromFile('c:\Datos.dat');
    sJSOn := datos.DataString;

     jl := TlkJSON.ParseText(sJSON) as TlkJSONlist;
     for I := 0 to jl.Count - 1 do
     begin
        ja := jl.child[i] as TlkJSONobject;
        ClientDataSet1.Insert;      
        ...

Con cualquiera de estas 2 fomas, obtendrás el código correcto, ahora si porque has indicado la codificación.


Mas vale tarde que nunca :)

Hoy(Sábado 05 de noviembre) me puse a revisar y analizar lo que me respondieron. Tienen razón al indicarme que el origen de datos tiene que ser ANSI o que yo mismo lo transforme en ANSI.

Antes de todo el aplicación que deseo modificar estaba en Delphi XE y no me compila esto ---> "TEncoding.ANSI".

Con mucha suerte y un poco de hiervas aromáticas conseguí que el aplicativo cargue en Delphi 11, utilizando sus propias clases para tratamiento de json y conseguí lo que necesitaba.

Muchas gracias por darme luz para comprender mejor las cadenas de datos

Your friend

StartKill
Lima-Perú

Casimiro Notevi 06-11-2022 11:01:06

^\||/^\||/^\||/


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

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