Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-01-2019
Yulexis Yulexis is offline
Miembro
 
Registrado: sep 2016
Posts: 19
Poder: 0
Yulexis Va por buen camino
Leer fichero JSON

Un saludo para todos.
Tengo la siguiente estructura en JSON, que cuenta con tres elementos(aunque estos pueden ser más o menos elementos en la vida real):

Cita:
{"nombre":"Juan", "destinatario": "Pedro", "mensaje": "de Juan para Pedro", "estado":"nuevo"}{"nombre":"Alberto", "destinatario": "Pedro", "mensaje": "de Alberto para Pedro", "estado":"nuevo"}{"nombre":"Carlos", "destinatario": "Pedro", "mensaje": "de Carlos para Pedro", "estado":"nuevo"}
Lo que necesito es recorrer todos los elementos e ir obteniendo de cada uno sus pares clave/valor:
nombre:
destinatario:
mensaje:
estado:

He leído que utilizando la unidad System.Json se puede, pero por más que busco y leo no encuentro la manera. En los ejemplos que encuentro siempre ponen de ejemplo otras estructuras JSON distintas a la que tengo yo y cuando intento modificarlos no hay manera.
Utilizo Delphi 10.2
Sin más, espero alguien me pudiera ayudar…

Última edición por Neftali [Germán.Estévez] fecha: 10-01-2019 a las 09:55:12. Razón: Corregir formato
Responder Con Cita
  #2  
Antiguo 09-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Te aconsejo que hagas una búsqueda en los foros por la palabra "json", salen varios enlaces que te deben servir.
Aunque tampoco has dicho exactamente qué error te sale.
Responder Con Cita
  #3  
Antiguo 10-01-2019
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.265
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
Lo primero que habría que hacer es colocar un JSON válido o completo.
El trozo de JSON que has puesto no cumple esa condición.

Para validarlo puedes probar cualquiera de los validadores en línea que hay:Verás que en todos obtienes el mismo resultado. Esa porción no es un JSON válido.
Una vez que lo tengas correcto, se puede realizar un parse con las clases de Delphi que comentas, utilizar otras como superobject o alguna otra herramienta externa como JSONToDelphiClass, que te genera de forma automática las clases delphi a partir de un JSON, para tratarlo cómodamente.
__________________
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
  #4  
Antiguo 11-01-2019
Yulexis Yulexis is offline
Miembro
 
Registrado: sep 2016
Posts: 19
Poder: 0
Yulexis Va por buen camino
Leer JSON

Muchas gracias Neftali y Casimiro Notevi
Germán nuevamente me tiras un cable hermano.
Tienes toda la rasón: no es un JSON válido, debería quedarme de esta forma (no les he puesto la manera en que lo traté de la forma en que esta porque la verdad me da hasta pena por lo disparatado e ineficiente del invento):
Código:
[{
              "nombre": "Juan",
              "destinatario": "Pedro",
              "mensaje": "de Juan para Pedro",
              "estado": "nuevo"
  }, {
              "nombre": "Alberto",
              "destinatario": "Pedro",
              "mensaje": "de Alberto para Pedro",
              "estado": "nuevo"
  }, {
              "nombre": "Carlos",
              "destinatario": "Pedro",
              "mensaje": "de Carlos para Pedro",
              "estado": "nuevo"
  }]
Ahora, en los foros de PHP que he leído (en php si que estoy en cero) el siguiente código (modificado para mis asuntos claro) es el que he encontrado para gerear un JSON y enviarlo a un cliente, pero ya veo que no es el corecto o simplemente estoy haciendo algo mal:
Código PHP:
function dame_mensajes($mysqli$usuario_solicitante)
  {
              
$mensajes='';
              
$sql 'SELECT * FROM bandeja_entrada WHERE destinatario = "' $usuario_solicitante '"';
   
              if (
$result $mysqli->query($sql)) 
              {
                          while(
$r=$result->fetch_assoc())
                          {
                              
$mensajes $mensajes json_encode($r);
                          }
                          
$result->close();
                          return 
$mensajes;
              }
              else
              {
                          return 
"ERROR:Ha ocurrido un error en el servidor.
  Intente el envío más tarde y si el problema persiste contacte con el administrador del sistema."
;
              }
  } 
Esta función la modifiqué para que me generara un JSON válido cambiando las siguientes líneas:
Código PHP:
$mensajes $mensajes json_encode($r); 
por
Código PHP:
$mensajes $mensajes "," json_encode($r); 
y

Código PHP:
return $mensajes
por
Código PHP:
return "[" $mensajes "]"
De esta manera (que no se si es la correcta) me genera “casi” lo que necesito. Digo “casi” porque me genera una coma (,) que no va (marcada en rojo).
Código:
[,{
              "nombre": "Juan",
              "destinatario": "Pedro",
              "mensaje": "de Juan para Pedro",
  …
¿Alguna idea para quitarla? O algún otro código para genrar el JSON correctamente.
Responder Con Cita
  #5  
Antiguo 11-01-2019
Yulexis Yulexis is offline
Miembro
 
Registrado: sep 2016
Posts: 19
Poder: 0
Yulexis Va por buen camino
Ya me falta menos

Saludos nuevamente.
Luego de tener el JSON con un formato correcto, este es el código para parsearlo y obtener los datos.
Aún me falta quitar en el PHP la coma que me genera de más para que todo ande como la seda.
Código Delphi [-]
var
  JSo :  TJSONObject;
  JSOarray : TJSONArray;
  JSOValue: TJSONValue;
  remitente, destinatario, mensaje, estado : string;
begin
      JSOarray := TJSONObject.ParseJSONValue(Memo_Respuesta.Text) as TJSONArray;
      for JSOValue in JSOarray do
      begin
        JSo := TJSONObject.ParseJSONValue(JSOValue.ToJSON) as TJSONObject;
        remitente :=  JSo.Values['nombre'].ToString;
        destinatario :=  JSo.Values['destinatario'].ToString;
        mensaje :=  JSo.Values['mensaje'].ToString;
        estado :=  JSo.Values['estado'].ToString;
      end;
end;

Neftali, Cuando comencé con este proyecto, que no es más que la interacción de una app android con un servicio web, esta y las otras entradas relacionadas fueron las que más me ayudaron a tener claro lo que debía hacer. Más allá de la metodología en sí que he utilizado: MUCHAS GRACIAS HERMANO.
http://neftali.clubdelphi.com/25-gen...ervice-en-php/


Aquí te dejo unas imágenes para que veas lo que estoy realizando y por si tienes alguna sugerencia. Espero puedas verlas.
https://nube.uic.cu/index.php/s/gfzw6tFxwTCwrCN
Responder Con Cita
  #6  
Antiguo 14-01-2019
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.265
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
Cita:
Empezado por Yulexis Ver Mensaje
Aquí te dejo unas imágenes para que veas lo que estoy realizando y por si tienes alguna sugerencia. Espero puedas verlas.
https://nube.uic.cu/index.php/s/gfzw6tFxwTCwrCN

La verdad es que tiene muy buena pinta.


No si si lo has revisado. En los ejemplos de la web verás que se usa el componente TRestResponseAdapter. No se si lo estás utilizando, pero te puede facilitar bastante el trabajo a la hora de recuperar resultados.
__________________
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
  #7  
Antiguo 14-01-2019
Yulexis Yulexis is offline
Miembro
 
Registrado: sep 2016
Posts: 19
Poder: 0
Yulexis Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
La verdad es que tiene muy buena pinta.


No si si lo has revisado. En los ejemplos de la web verás que se usa el componente TRestResponseAdapter. No se si lo estás utilizando, pero te puede facilitar bastante el trabajo a la hora de recuperar resultados.

Primero, gracias por el elogio hermano. Intenté crear una intefaz lo más novedosa posible, sin seguir lo estereotipos que todo el mundo usa. Al final, dejando un poco la modestia de un lado, creo que lo he logrado (por lo menos, aunque no lo creas, la opinión que me has dado vale mucho para mi). Muchos de mis compañeros me han criticado por crearla así, le he explicado mi objetivo y forma de pensar, y les he hecho caso omiso.
En mi país hay un dicho que reza: rindes más que una raspadura. Esto se le dice a una persona cuando alaga mucho a otra. No quiero que pienses que me estoy portando de esa manera, solo que en verdad cuenta para mí lo que me dices.
Correcto, vi que el ejemplo utiliza TRestResponseAdapter pero siéndote sincero, me perdí cuando intenté usarlo así que lo obvié y creé mi propia chapuza que funciona y creo que no es tan ineficiente.
Lo de la coma que me sobra en el JSON, lo resolví desde el propio programa eliminándola. Como sé que la estructura de los datos no van a variar…
Ahora: tengo unas cosas que no sé realizar y que me harán están haciendo falta en este proyecto. No sé si pedirte ayuda por aquí, abrir otro hilo (no creo que sea lo mejor porque es un tema muy tratado que no he podido implementar por mucho que he leído), o escribirte por privado. Bueno… usted me dice.
Responder Con Cita
  #8  
Antiguo 18-01-2019
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.265
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
Cita:
Empezado por Yulexis Ver Mensaje
Ahora: tengo unas cosas que no sé realizar y que me harán están haciendo falta en este proyecto. No sé si pedirte ayuda por aquí, abrir otro hilo (no creo que sea lo mejor porque es un tema muy tratado que no he podido implementar por mucho que he leído), o escribirte por privado. Bueno… usted me dice.

Hola.
Si son dudas sobre problemas distintos, lo correcto es que abras otra hilo para no mezclar temas.
Explícalo aquí con detalle y seguro que entre todos podremos ayudarte.
El tema de los privados no es recomendable, primero porque otra gente (que los hay que saben mucho más que yo por aquí) no podrán ayudarte y también porque esa información por privado no está disponible para otros usuarios que la necesiten porque tengan problemas similares.
__________________
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
  #9  
Antiguo 21-01-2019
Yulexis Yulexis is offline
Miembro
 
Registrado: sep 2016
Posts: 19
Poder: 0
Yulexis Va por buen camino
Vale.
Organizaré las ideas y abriré otro hilo cuando no encuentre la solución.
Responder Con Cita
  #10  
Antiguo 23-01-2019
Yulexis Yulexis is offline
Miembro
 
Registrado: sep 2016
Posts: 19
Poder: 0
Yulexis Va por buen camino
[Resuelto lo de la coma]

Como les comenté en un mensaje anterior, tenía problemas en el código PHP ya que me generaba una coma (,) de más. La solución es la siguiente:


Código PHP:
<?
/* Esta función devuelve un array con los datos obtenidos en una consulta*/
function Leer_Datos($sql)
{
    
//connectDB es una función que crea la conexión con la BD. Puedes reemplazar esta parte y poner el código de conexión aquí.
    
$conexion connectDB();

    
mysqli_set_charset($conexion"utf8"); //Esto es para el tratamiento de caracteres especiales.

    
if(!$result mysqli_query($conexion$sql)) die(); //Realizamos la consulta y en caso que falle salimos.

    
$rawdata = array(); //creamos un array

    //Guardamos en un array multidimensional todos los datos de la consulta.
    
$i=0;

    while(
$row mysqli_fetch_array($result))
    {
        
$rawdata[$i] = $row;
        
$i++;
    }

    
//Esta es otra función que nos desconecta de la BD. Puedes hacer lo mismo que con la función de conexión.
    
disconnectDB($conexion);

    return 
$rawdata//devolvemos el array
}


/* Para llamar a la función */
$sql 'SELECT * FROM tabla'//Aquí puedes poner la consulta que quieras.
$myArray Leer_Datos($sql);
echo 
json_encode($myArray); //Convertimos el array en un JSON válido y se lo enviamos al usuario.

?>
Espero a alguien le pueda servir.
Con este código doy por RESUELTO el tema pricipal del hilo.
Responder Con Cita
  #11  
Antiguo 23-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Leer JSON sin nombre Ramsay Varios 2 27-09-2016 14:52:52
Leer fichero ini Angel.Matilla C++ Builder 13 21-04-2015 23:28:27
Leer fichero XML itsi Internet 1 23-10-2008 22:50:15
leer de fichero machingol Varios 7 09-05-2007 17:22:42
Leer fichero rocio84 Varios 1 21-05-2006 10:45:06


La franja horaria es GMT +2. Ahora son las 22:35:19.


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