Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-10-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
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ú
Responder Con Cita
  #2  
Antiguo 18-10-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y qué problema tienes?
Responder Con Cita
  #3  
Antiguo 18-10-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
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ú
Responder Con Cita
  #4  
Antiguo 18-10-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Prueba algo similar a:
Código Delphi [-]
valor := AnsiToUtf8( valor );

Última edición por Casimiro Notevi fecha: Hace 1 Semana a las 09:36:09.
Responder Con Cita
  #5  
Antiguo 18-10-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Responder Con Cita
  #6  
Antiguo 18-10-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Pero el "json" que lees está en utf8?
Responder Con Cita
  #7  
Antiguo 18-10-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿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
}
]
Responder Con Cita
  #8  
Antiguo 19-10-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿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);
Responder Con Cita
  #9  
Antiguo 19-10-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.

__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 19-10-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Saludos Casimiro, Neftali

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

Ss

StartKill
Responder Con Cita
  #11  
Antiguo 06-11-2022
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 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
  #12  
Antiguo 06-11-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema viendo resultados con uLkJSON JuanOrtega Varios 6 18-12-2014 19:49:21


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


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
Copyright 1996-2007 Club Delphi