JSONMarshalled 在 Delphi XE10 中不起作用(再次)
JSONMarshalled not working in Delphi XE10 (again)
我有一个 class 我想传递给 datasnap 服务器,但是 class 包含这个字段 Picture 应该是一个 TPicture 但是现在我使用一个整数来避免得到 marshall错误 "tkPointer currently not supported" :(
我尝试通过添加 [JSONMarshalled(False)] 来省略 field/property "Picture",但没有成功。
我已经按照这里的帖子中的建议添加了单位
JSONMarshalled not working in Delphi
unit TestObjU;
interface
uses
Classes, System.Generics.Collections, System.SyncObjs, System.SysUtils,
JSON, DBXJsonReflect, REST.JSON,
Data.FireDACJSONReflect, FireDAC.Comp.Client, vcl.ExtCtrls,
pngimage, graphics, variants,
GlobalFunctionsU, GlobalTypesU;
{$M+}
{$RTTI EXPLICIT FIELDS([vcPrivate])}
type
EPerson = class(Exception);
EPersonsList = class(Exception);
TGender = (Female, Male);
TPerson = class(TObject)
private
FFirstName: string;
FLastName: string;
FId: Integer;
FGender: TGender;
FModified : Boolean;
[JSONMarshalled(False)]
FPicture: Integer;
// [JSONMarshalled(False)] FPicture : TPicture;
function GetName: string;
procedure SetFirstName(const Value: string);
procedure SetLastName(const Value: string);
function GetId: Integer;
procedure SetGender(const Value: TGender);
procedure SetModified(const Value: Boolean);
public
property Id : Integer read GetId;
property Name : string read GetName;
property FirstName : string read FFirstName write SetFirstName;
property LastName : string read FLastName write SetLastName;
property Gender : TGender read FGender write SetGender;
property Modified : Boolean read FModified write SetModified;
// property Picture : TPicture read FPicture write FPicture;
[JSONMarshalled(False)]
property Picture : Integer read FPicture write FPicture;
function Update : Boolean;
function Delete : Boolean;
constructor Create(AId : Integer; AFirstName, ALastName : string; AGender : TGender); overload;
constructor Create(AFirstName, ALastName : string; AGender : TGender); overload;
destructor destroy; override;
function ToJsonString: string;
end;
但显然它对编组没有影响,图片仍然存在 - 我错过了什么?
function TPerson.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
08-03-2016 10:26:24 [NORMAL] AddPerson serialized {"firstName":"Donald","lastName":"Duck","id":24,"gender":"Female","modified":false,"picture":92415648}
您正在使用 REST.Json
单元中的 TJson.ObjectToJsonString
,并且需要不同的属性来跳过名为 JSONMarshalledAttribute
的字段
您应该将代码更改为 [JSONMarshalledAttribute(False)]
Delphi 在较旧的 Data.DBXJsonReflect
和较新的 REST.Json
单元之间有一些混淆,您不应该在同一代码中将它们混合在一起。只选其中一项。
REST.Json.TJson.ObjectToJsonString
是 - 我找到了解决方案,当使用 DBX(而不是 REST)时,您需要添加此单元 "Data.DBXJSON" 而不是 "REST.JSON" 并更改两个 "from/to" 方法对于 un/marshaling 这个对象是这样的。
注意。 ToJSONString 由于某种原因泄漏,我将不得不对此进行更多调查。
function TPerson.ToJsonString: string;
var
JSONMarshal: TJSONMarshal;
begin
result := '';
JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
try
Result := JSONMarshal.Marshal(self).ToString;
finally
JSONMarshal.Free;
end;
end;
class function TPerson.FromJsonString(AJSONString: string): TPerson;
var
JSONUnMarshal: TJSONUnMarshal;
begin
JSONUnMarshal := TJSONUnMarshal.Create;
try
Result := JSONUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(AJSONString)) as TPerson;
finally
JSONUnMarshal.Free;
end;
end;
我有一个 class 我想传递给 datasnap 服务器,但是 class 包含这个字段 Picture 应该是一个 TPicture 但是现在我使用一个整数来避免得到 marshall错误 "tkPointer currently not supported" :(
我尝试通过添加 [JSONMarshalled(False)] 来省略 field/property "Picture",但没有成功。
我已经按照这里的帖子中的建议添加了单位 JSONMarshalled not working in Delphi
unit TestObjU;
interface
uses
Classes, System.Generics.Collections, System.SyncObjs, System.SysUtils,
JSON, DBXJsonReflect, REST.JSON,
Data.FireDACJSONReflect, FireDAC.Comp.Client, vcl.ExtCtrls,
pngimage, graphics, variants,
GlobalFunctionsU, GlobalTypesU;
{$M+}
{$RTTI EXPLICIT FIELDS([vcPrivate])}
type
EPerson = class(Exception);
EPersonsList = class(Exception);
TGender = (Female, Male);
TPerson = class(TObject)
private
FFirstName: string;
FLastName: string;
FId: Integer;
FGender: TGender;
FModified : Boolean;
[JSONMarshalled(False)]
FPicture: Integer;
// [JSONMarshalled(False)] FPicture : TPicture;
function GetName: string;
procedure SetFirstName(const Value: string);
procedure SetLastName(const Value: string);
function GetId: Integer;
procedure SetGender(const Value: TGender);
procedure SetModified(const Value: Boolean);
public
property Id : Integer read GetId;
property Name : string read GetName;
property FirstName : string read FFirstName write SetFirstName;
property LastName : string read FLastName write SetLastName;
property Gender : TGender read FGender write SetGender;
property Modified : Boolean read FModified write SetModified;
// property Picture : TPicture read FPicture write FPicture;
[JSONMarshalled(False)]
property Picture : Integer read FPicture write FPicture;
function Update : Boolean;
function Delete : Boolean;
constructor Create(AId : Integer; AFirstName, ALastName : string; AGender : TGender); overload;
constructor Create(AFirstName, ALastName : string; AGender : TGender); overload;
destructor destroy; override;
function ToJsonString: string;
end;
但显然它对编组没有影响,图片仍然存在 - 我错过了什么?
function TPerson.ToJsonString: string;
begin
result := TJson.ObjectToJsonString(self);
end;
08-03-2016 10:26:24 [NORMAL] AddPerson serialized {"firstName":"Donald","lastName":"Duck","id":24,"gender":"Female","modified":false,"picture":92415648}
您正在使用 REST.Json
单元中的 TJson.ObjectToJsonString
,并且需要不同的属性来跳过名为 JSONMarshalledAttribute
您应该将代码更改为 [JSONMarshalledAttribute(False)]
Delphi 在较旧的 Data.DBXJsonReflect
和较新的 REST.Json
单元之间有一些混淆,您不应该在同一代码中将它们混合在一起。只选其中一项。
REST.Json.TJson.ObjectToJsonString
是 - 我找到了解决方案,当使用 DBX(而不是 REST)时,您需要添加此单元 "Data.DBXJSON" 而不是 "REST.JSON" 并更改两个 "from/to" 方法对于 un/marshaling 这个对象是这样的。
注意。 ToJSONString 由于某种原因泄漏,我将不得不对此进行更多调查。
function TPerson.ToJsonString: string;
var
JSONMarshal: TJSONMarshal;
begin
result := '';
JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
try
Result := JSONMarshal.Marshal(self).ToString;
finally
JSONMarshal.Free;
end;
end;
class function TPerson.FromJsonString(AJSONString: string): TPerson;
var
JSONUnMarshal: TJSONUnMarshal;
begin
JSONUnMarshal := TJSONUnMarshal.Create;
try
Result := JSONUnMarshal.Unmarshal(TJSONObject.ParseJSONValue(AJSONString)) as TPerson;
finally
JSONUnMarshal.Free;
end;
end;