Property TObjectList JSON

Delphi

02/04/2012

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

Curtidas 0

Respostas

Marco Salles

Marco Salles

02/04/2012

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/
GOSTEI 0
Wender Ferreira

Wender Ferreira

02/04/2012

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.
GOSTEI 0
Marco Salles

Marco Salles

02/04/2012

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;
GOSTEI 0
Wender Ferreira

Wender Ferreira

02/04/2012

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;
GOSTEI 0
Marco Salles

Marco Salles

02/04/2012

Ok .. Obrigado por compartilhar
GOSTEI 0
POSTAR