PDA

Ver la Versión Completa : uLkJSON con Delphi XE


StartKill
18-10-2022, 18:24:42
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


//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:
valor := AnsiToUtf8( valor );

StartKill
18-10-2022, 20:21:36
Prueba algo similar a:
valor := AntiToUtf8( valor );

Gracias por responder, pero no tengo los resultados esperado

Tildes fallan uLkJSON con Delphi XE (https://gyazo.com/e5a86521958398d82af31d626b0cd4bc)

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
¿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?
obj := TlkJSON.ParseText(ssRespuesta.DataString);
¿Y si usas VarToStr?
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:


...
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:

...
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.

https://i.imgur.com/OZF1fLv.png

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
;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:


...
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:

...
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.

https://i.imgur.com/OZF1fLv.png

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
^\||/^\||/^\||/