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
^\||/^\||/^\||/
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.