GARANTIR DESCONTO

Fórum Property TObjectList JSON #414938

02/04/2012

0

Boa tarde a todos...

Estou com dificuldade para converter um objeto em JSON sendo que o objeto tem uma property do tipo TObjectList. Também preciso reverter esse mesmo objeto de JSON para sua forma origem.

Alguém poderia me dar uma luz?

Grato por ajudas.
Wender Ferreira

Wender Ferreira

Responder

Posts

02/04/2012

Marco Salles

como voce esta fazendo ???

Acredito que tem que ser feito na mão ..

Marshal e Unmarshal talves não irá funcionar

veja este exemplo

http://marcosalles.wordpress.com/2011/05/03/muito-prazer-eu-me-chamo-json/
Responder

Gostei + 0

03/04/2012

Wender Ferreira

Segue meus códigos para análise...

Converte objeto para JSON:
function ObjectToJSON(objeto: TBase) : TJSONValue;
var
  marshal : TJSONMarshal;
begin
  if objeto = nil then
  begin
    Result := TJSONNull.Create;
    Exit;
  end;

  try
    marshal := TJSONMarshal.Create(TJSONConverter.Create);
    marshal.RegisterConverter(TObjectList,
      function(Data: TObject): TListOfObjects
      var
        i    : Integer;
        list : TObjectList;
      begin
        list := TObjectList(Data);
        SetLength(Result,TObjectList(Data).Count);
        if list.Count > 0 then
          for i := 0 to TObjectList(Data).Count-1 do
            Result[i] := list[i];
      end
      );
    Result := marshal.Marshal(objeto);
  finally
    marshal.Free;
  end;
end;


Converte de JSON para objeto
procedure JSONToObject(var objeto: TBase; json : TJSONValue);
var
  unMarshal : TJSONUnMarshal;
begin
  if json is TJSONNull then
  begin
    objeto := nil;
    Exit;
  end;

  try
    unMarshal := TJSONUnMarshal.Create;
    unMarshal.RegisterReverter(TObjectList,
      function(Data: TListOfObjects) : TObject
      var
        i    : Integer;
        list : TObjectList;
        obj  : TObject;
      begin
        list := TObjectList.Create;
        list.Clear;
        for obj in Data do
        begin
          if obj <> nil then
            list.Add(obj);
        end;

        Result := list;
      end
    );
    objeto := unMarshal.UnMarshal(json) as TBase;
  finally
    unMarshal.Free;
  end;
end;


Grato por informações.
Responder

Gostei + 0

06/04/2012

Marco Salles

Testei seu codigo e parece que esta tudo em com ele



Type
Tpessoa  = class
nome:string;
end;


type
TBase = class
cidade:String;
Moradores:TObjectList<Tpessoa>
constructor create;
destructor destroy; override;
end;


var
pessoa_Um:Tpessoa;
pessoa_Dois:Tpessoa;
Obj:Tbase;
json : TJSONValue;


procedure TForm9.ObjctoToJsonClick(Sender: TObject);
begin
json:=ObjectToJSON(obj);
end;


procedure TForm9.JsonToObjectoClick(Sender: TObject);
var
 Myobj:TBase;
 objPessoa:TPessoa;
begin
JSONToObject(Myobj,json);
try
showmessage(Cidade +Myobj.cidade+ Moradores são );
for Objpessoa in Myobj.Moradores do
showmessage(objPessoa.nome);
finally
  Myobj.Free;
end;
end;


constructor TBase.create;
begin
 Moradores:=TObjectList<Tpessoa>.Create;
end;


destructor TBase.destroy;
begin
   Moradores.Free;
  inherited;
end;


procedure TForm9.FormDestroy(Sender: TObject);
begin
Obj.Free;
if Assigned(Json) then
json.Free;
end;
Responder

Gostei + 0

09/04/2012

Wender Ferreira

Bom dia Marcos,

Fico muito agradecido pelas informações e pelo seu tempo desprendido para me auxiliar e realmente vi que não havia nada errado com meu código.
O problema é que uma de minhas classes tinha um TStringlist e este eu não estava convertendo para JSON e depois revertendo, por isso acontecia o problema.

Meu código agora está 100%, estou postando ele abaixo para que outras pessoas possam utilizá-lo quando necessário.

Mais uma vez, muito obrigado.


Objeto para JSON:

function ObjectToJSON(objeto: TBase) : TJSONValue;
var
  marshal : TJSONMarshal;
begin
  if objeto = nil then
  begin
    Result := TJSONNull.Create;
    Exit;
  end;

  try
    marshal := TJSONMarshal.Create(TJSONConverter.Create);
    marshal.RegisterConverter(TObjectList,
      function(Data: TObject): TListOfObjects
      var
        i    : Integer;
        list : TObjectList;
      begin
        list := TObjectList(Data);
        SetLength(Result,TObjectList(Data).Count);
        if list.Count > 0 then
          for i := 0 to TObjectList(Data).Count-1 do
            Result[i] := list[i];
      end
      );
    marshal.RegisterConverter(TStringList,
      function(Data: TObject): TListOfStrings
      var
        i,
        count : integer;
      begin
        count := TStringList(Data).Count;
        SetLength(Result, count);
        for I := 0 to count - 1 do
          Result[i] := TStringList(Data)[i];
      end
    );
    Result := marshal.Marshal(objeto);
  finally
    marshal.Free;
  end;
end;


JSON para objeto
procedure JSONToObject(var objeto: TBase; json : TJSONValue);
var
  unMarshal : TJSONUnMarshal;
begin
  if json is TJSONNull then
  begin
    objeto := nil;
    Exit;
  end;

  try
    unMarshal := TJSONUnMarshal.Create;
    unMarshal.RegisterReverter(TObjectList,
      function(Data: TListOfObjects) : TObject
      var
        i    : Integer;
        list : TObjectList;
        obj  : TObject;
      begin
        list := TObjectList.Create;
        list.Clear;
        for obj in Data do
        begin
          if obj <> nil then
            list.Add(obj);
        end;

        Result := list;
      end
    );
    unMarshal.RegisterReverter(TStringList,
      function(Data: TListOfStrings): TObject
      var
        StrList: TStringList;
        Str: string;

      begin
        StrList := TStringList.Create;
        for Str in Data do
          StrList.Add(Str);
        Result := StrList;
      end
    );
    objeto := unMarshal.UnMarshal(json) as TBase;
  finally
    unMarshal.Free;
  end;
end;
Responder

Gostei + 0

09/04/2012

Marco Salles

Ok .. Obrigado por compartilhar
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar