Ver Mensaje Individual
  #11  
Antiguo 06-11-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Reputación: 21
StartKill Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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ú
Responder Con Cita