PDA

Ver la Versión Completa : Leer fichero JSON


Yulexis
09-01-2019, 17:05:46
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):

{"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:

https://jsonlint.com/
https://codebeautify.org/jsonvalidator (https://codebeautify.org/jsonvalidator)
https://jsonformatter.curiousconcept.com/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 (https://github.com/hgourvest/superobject) o alguna otra herramienta externa como JSONToDelphiClass (https://jsontodelphi.com/), 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
Muchas gracias Neftali (http://www.clubdelphi.com/foros/member.php?u=3561) y Casimiro Notevi (http://www.clubdelphi.com/foros/member.php?u=4021)
Germán (http://www.clubdelphi.com/foros/member.php?u=3561) 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):
[{
"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:
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:
$mensajes = $mensajes . json_encode($r); por
$mensajes = $mensajes . "," . json_encode($r);y

return $mensajes; por
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).
[,{
"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
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.

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 (http://www.clubdelphi.com/foros/member.php?u=3561), 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-generacion-del-webservice-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
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
;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
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
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:


<?
/* 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
^\||/^\||/^\||/