Property TObjectList JSON
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.
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
Curtidas 0
Respostas
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/
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
02/04/2012
Segue meus códigos para análise...
Converte objeto para JSON:
Converte de JSON para objeto
Grato por informações.
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
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
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:
JSON para objeto
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
02/04/2012
Ok .. Obrigado por compartilhar
GOSTEI 0