2012-04-10 39 views

Trả lời

8

Giải pháp khá dễ dàng nhưng bị ẩn rất tốt. Bạn nên đặt thuộc tính lớp JSONMarshalled thành False cho các trường bạn không muốn tuần tự hóa hoặc không tham số hóa.

Giả sử bạn đã tuyên bố lớp sau bạn muốn sắp xếp:

type 
    TPerson = class 
    private 
    FName: string; 
    FSurname: string; 
    FHeight: Integer; 
    public 
    constructor Create; 
    destructor Destroy; override; 
    end; 

Trong tuyên bố này, chỉ FNameFHeight sẽ được tuần tự và deserialized, các FSurname sẽ được bỏ qua:

type 
    TPerson = class 
    private 
    FName: string; 
    [JSONMarshalled(False)] 
    FSurname: string; 
    FHeight: Integer; 
    public 
    constructor Create; 
    destructor Destroy; override; 
    end; 

Ở đây bạn có một số mã để chơi với:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.StdCtrls, Data.DBXJSON, Data.DBXJSONReflect; 

type 
    TPerson = class 
    private 
    FName: string; 
    // try to comment and uncomment the following line and see the result 
    [JSONMarshalled(False)] 
    FSurname: string; 
    FHeight: Integer; 
    end; 

type 
    TForm1 = class(TForm) 
    Memo1: TMemo; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Person: TPerson; 
    JSONString: string; 
    JSONMarshal: TJSONMarshal; 
    JSONUnMarshal: TJSONUnMarshal; 
begin 
    JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create); 
    try 
    Person := TPerson.Create; 
    try 
     Person.FName := 'Petra'; 
     Person.FSurname := 'Kvitova'; 
     Person.FHeight := 183; 

     JSONString := JSONMarshal.Marshal(Person).ToString; 
     Memo1.Text := JSONString; 
    finally 
     FreeAndNil(Person); 
    end; 
    finally 
    JSONMarshal.Free; 
    end; 

    JSONUnMarshal := TJSONUnMarshal.Create; 
    try 
    Person := JSONUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(JSONString)) as TPerson; 
    try 
     ShowMessage(
     'Name: ' + Person.FName + sLineBreak + 
     'Surname: ' + Person.FSurname + sLineBreak + 
     'Height: ' + IntToStr(Person.FHeight) + ' cm' 
    ); 
    finally 
     Person.Free; 
    end; 
    finally 
    JSONUnMarshal.Free; 
    end; 
end; 

end. 
Các vấn đề liên quan