json传输对象

The data types allowed to be transfered in DataSnap 2009 is limited to the dbExpress data types, but in DataSnap 2010 part of Delphi 2010 you are allowed to transfer any kind of object.

 

Let’s define the object we would like to transfer, class TCustomer

unit Customer;
 
interface
 
uses
   DBXJSON, DBXJSONReflect, SysUtils;
 
type
   TMaritalStatus = (msMarried, msEngaged, msEligible);
 
TCustomer = class
    private
       FName: string;
       FAge: integer;
       FMaritalStatus: TMaritalStatus;
    public
        property Name: string read FName write FName;
        property Age: integer read FAge write FAge;
        property MaritalStatus: TMaritalStatus read FMaritalStatus write FMaritalStatus;
 
        function toString : string;override;
  end;

 

Only objects that descend from TJSONObject are able to be transferred between client and server without any transformation in DataSnap 2010. If your object does not descend from TJSONObject, then you have to use the TJSONMarshal and TJSONUnMarshal classes to convert those objects. The example below shows how to make this conversion.

function CustomerToJSON(customer: TCustomer): TJSONValue;
  var
    m: TJSONMarshal;
  begin
    if Assigned(customer) then
    begin
      m := TJSONMarshal.Create(TJSONConverter.Create);
      try
        exit(m.Marshal(customer))
      finally
        m.Free;
      end;
    end
    else
      exit(TJSONNull.Create);
  end;

 

function JSONToCustomer(json: TJSONValue): TCustomer;

  var

     unm: TJSONUnMarshal;

  begin

    if json is TJSONNull then

      exit(nil);

    unm := TJSONUnMarshal.Create;

    try

      exit(unm.Unmarshal(json) as TCustomer)

    finally

      unm.Free;

    end;

  end;

 

// protected
function TServerMethods.GetCustomer: TCustomer;
begin
  Result := TCustomer.Create;
  Result.Name := 'Pedro';
  Result.Age := 30;
  Result.MaritalStatus := msEligible;
end;
 
// public
function TServerMethods.GetJSONCustomer(): TJSONValue;
var
  myCustomer: TCustomer;
begin
  myCustomer := GetCustomer;
  Result := CustomerToJSON(myCustomer);
  myCustomer.Free;
end;

 

var
  proxy: TServerMethodsClient;
  myJSONCustomer: TCustomer;
begin
 
  try
    proxy := TServerMethodsClient.Create(SQLConnection1.DBXConnection);
    myJSONCustomer := JSONToCustomer(proxy.myJSONCustomer);
 
    Button1.Caption := myJSONCustomer.ToString;
    myJSONCustomer.Free;
  finally
    SQLConnection1.CloneConnection;
    proxy.Free;
  end;
end;

 

posted @ 2011-01-04 15:23  delphi中间件  阅读(471)  评论(0编辑  收藏  举报