jhonny
08-10-2015, 18:17:35
Buenos días, tardes, noches... a todos segun corresponda.
Hoy vengo a plantear un caso y saber si a ustedes les ha pasado esto y si lo han solucionado de alguna manera diferente.
Tengo Un DataSnap Server al cual me conecto por medio de su TDSHTTPService utilizando sus cualidades REST por medio de JSon.
En algun momento he necesitado compartir imagenes, archivos o en fin cualquier TStream, así que tengo una función en el server, parecida a esta, que devuelve el TStream serializado como TJsonArray, así:
function TServerMethods.GetImagen: TJSONArray;
var
vStream: TStream;
begin
vStream := TStream.Create;
try
vStream := GetImagenInterno;
Result := TDBXJSONTools.StreamToJSON(vStream, 0, vStream.Size);
finally
vStream.Free;
end;
end;
Básicamente lo que hace es cargar un archivo y devolverlo serializado en un TJsonArray de enteros, que debería verse así, por ejemplo:
[1, 5, 7, 8, 9...]
Pero por alguna razón el server envía dicho TJsonArray, así:
[[1, 5, 7, 8, 9...]]
Como pueden ver, por alguna razón por mí desconocida hasta el momento, agrega un corchete de más al inicio y un corchete de más, al final... por lo que al tratar de hacer lo siguiente en el cliente no convierte correctamente el arreglo a TStream:
var
vJArray: TJSONArray;
vMemStream: TMemoryStream;
begin
vMemStream := TMemoryStream.Create;
try
RESTRequest2.Execute;
vJArray := TJSONObject.ParseJSONValue(RESTResponse2.Content) as TJSONArray;
vMemStream.LoadFromStream(TDBXJSONTools.JSONToStream(vJArray)); //Con esto convierto de TJSonArray a TStream
ImageViewer1.Bitmap.LoadFromStream(vMemStream);
finally
vMemStream.Free;
end;
end;
Por lo que si hago una "chapuza" (Como la siguiente) para quitar de la cadena de texto recibida ese corchete incial y final de más... pues me muestra la imagen y todo aparenta estar bien, pero no es algo optimo ya que es un paso de más que finalmente afectará el rendimiento de la aplicación cliente:
var
vJArray: TJSONArray;
vMemStream: TMemoryStream;
vCadena: String;
begin
vMemStream := TMemoryStream.Create;
try
RESTRequest2.Execute;
vCadena := DMPrincipal.RESTResponse2.Content;
vCadena[1] := ' ';
vCadena[Length(vCadena)] := ' ';
vJArray := TJSONObject.ParseJSONValue(vCadena) as TJSONArray;
vMemStream.LoadFromStream(TDBXJSONTools.JSONToStream(vJArray)); //Con esto convierto de TJSonArray a TStream
ImageViewer1.Bitmap.LoadFromStream(vMemStream);
finally
vMemStream.Free;
end;
end;
La duda finalmente es, ¿Qué debería hacer para que el server me devuelva de manera natural y sin este tipo de "chapuzeras" correctamente el TJsonArray, sin esos corchetes de más?
Por su tiempo y atención, muchas gracias :)
Hoy vengo a plantear un caso y saber si a ustedes les ha pasado esto y si lo han solucionado de alguna manera diferente.
Tengo Un DataSnap Server al cual me conecto por medio de su TDSHTTPService utilizando sus cualidades REST por medio de JSon.
En algun momento he necesitado compartir imagenes, archivos o en fin cualquier TStream, así que tengo una función en el server, parecida a esta, que devuelve el TStream serializado como TJsonArray, así:
function TServerMethods.GetImagen: TJSONArray;
var
vStream: TStream;
begin
vStream := TStream.Create;
try
vStream := GetImagenInterno;
Result := TDBXJSONTools.StreamToJSON(vStream, 0, vStream.Size);
finally
vStream.Free;
end;
end;
Básicamente lo que hace es cargar un archivo y devolverlo serializado en un TJsonArray de enteros, que debería verse así, por ejemplo:
[1, 5, 7, 8, 9...]
Pero por alguna razón el server envía dicho TJsonArray, así:
[[1, 5, 7, 8, 9...]]
Como pueden ver, por alguna razón por mí desconocida hasta el momento, agrega un corchete de más al inicio y un corchete de más, al final... por lo que al tratar de hacer lo siguiente en el cliente no convierte correctamente el arreglo a TStream:
var
vJArray: TJSONArray;
vMemStream: TMemoryStream;
begin
vMemStream := TMemoryStream.Create;
try
RESTRequest2.Execute;
vJArray := TJSONObject.ParseJSONValue(RESTResponse2.Content) as TJSONArray;
vMemStream.LoadFromStream(TDBXJSONTools.JSONToStream(vJArray)); //Con esto convierto de TJSonArray a TStream
ImageViewer1.Bitmap.LoadFromStream(vMemStream);
finally
vMemStream.Free;
end;
end;
Por lo que si hago una "chapuza" (Como la siguiente) para quitar de la cadena de texto recibida ese corchete incial y final de más... pues me muestra la imagen y todo aparenta estar bien, pero no es algo optimo ya que es un paso de más que finalmente afectará el rendimiento de la aplicación cliente:
var
vJArray: TJSONArray;
vMemStream: TMemoryStream;
vCadena: String;
begin
vMemStream := TMemoryStream.Create;
try
RESTRequest2.Execute;
vCadena := DMPrincipal.RESTResponse2.Content;
vCadena[1] := ' ';
vCadena[Length(vCadena)] := ' ';
vJArray := TJSONObject.ParseJSONValue(vCadena) as TJSONArray;
vMemStream.LoadFromStream(TDBXJSONTools.JSONToStream(vJArray)); //Con esto convierto de TJSonArray a TStream
ImageViewer1.Bitmap.LoadFromStream(vMemStream);
finally
vMemStream.Free;
end;
end;
La duda finalmente es, ¿Qué debería hacer para que el server me devuelva de manera natural y sin este tipo de "chapuzeras" correctamente el TJsonArray, sin esos corchetes de más?
Por su tiempo y atención, muchas gracias :)