Ver Mensaje Individual
  #1  
Antiguo 08-10-2015
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Reputación: 30
jhonny Va camino a la famajhonny Va camino a la fama
TJsonArray con corchetes de más

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í:

Código Delphi [-]
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:
Código:
[1, 5, 7, 8, 9...]
Pero por alguna razón el server envía dicho TJsonArray, así:
Código:
[[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:

Código Delphi [-]
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:

Código Delphi [-]
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
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita