Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer fichero JSON (https://www.clubdelphi.com/foros/showthread.php?t=93685)

Yulexis 09-01-2019 17:05:46

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…

Casimiro Notevi 09-01-2019 22:31:04

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.

Neftali [Germán.Estévez] 10-01-2019 09:59:57

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.

Yulexis 11-01-2019 16:00:15

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.

Yulexis 11-01-2019 17:59:14

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

Neftali [Germán.Estévez] 14-01-2019 09:14:41

Cita:

Empezado por Yulexis (Mensaje 530330)
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.

Yulexis 14-01-2019 14:55:11

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 530347)
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.

Neftali [Germán.Estévez] 18-01-2019 13:21:50

Cita:

Empezado por Yulexis (Mensaje 530350)
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.

Yulexis 21-01-2019 15:58:54

Vale.
Organizaré las ideas y abriré otro hilo cuando no encuentre la solución.

Yulexis 23-01-2019 14:44:03

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

Casimiro Notevi 23-01-2019 14:54:58

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 21:41:09.

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