我在Delphi中有一个类,我在jsonmarshalled文件中导出。
我正在使用JSONMarshalledAttribute跳过一些字段,它位于单元中:REST.JSON.Types。更多文献here
[JSONMarshalledAttribute(False)]
Field1: double;
[JSONMarshalledAttribute(False)]
Field2: double;
到目前为止,这很有效。
我的问题是:我可以在运行时将JSONMarshalledAttribute更改为True吗?
编辑1:
这里要求的是代码:
假设我们有一个Form2:TForm,其形式如下......:
界面(我正在跳过表单的属性....)
type
TmyClass = class(Tobject)
private
[JSONMarshalledAttribute(false)]
FName: string;
FVal1: double;
public
property Name: string read FName write FName;
property Val1: double read FVal1 write FVal1;
end;
然后在实施中:
procedure TForm2.Button2Click(Sender: Tobject);
var
LArray: TJSONArray;
begin
MyClass := TmyClass.Create;
MyClass.name := 'myNAme';
LArray := myMarshaler(MyClass, 'FName', True);
end;
和返回TJSONArray的实际函数:
function TForm2.myMarshaler(myclass: TmyClass; Field: string; Marshal: Boolean)
: TJSONArray;
var
Marshaler: TJSONMarshal;
JSONObject: TJSONObject;
LArray: TJSONArray;
begin
Marshaler := TJSONMarshal.Create(TJSONConverter.Create);
try
Marshaler.RegisterJSONMarshalled(myclass, Field,Marshal);
// Marshaler.DateFormat := jdfUnix;
JSONObject := Marshaler.Marshal(myclass) as TJSONObject;
LArray := TJSONArray.Create;
LArray.AddElement(JSONObject);
result := LArray;
finally
FreeAndNil(Marshaler);
end;
end;
这不起作用,因为Marshaler.RegisterJSONMarshalled需要一个TClass作为参数类型,但我想输入我自己的派生自TObject的自定义类。
这是错误:
[dcc32错误] Unit2.pas(134):E2250没有可以使用这些参数调用的>'RegisterJSONMarshalled'的重载版本
我该如何解决这个问题?
答案 0 :(得分:1)
您无法更改属性,但可以覆盖它。
根据documentation,它应该适用于:
Marshaler.RegisterJSONMarshalled(TYourClass, 'Field1', true);
因此,您无法使用类函数TJson.ObjectToJsonObject(...)
, - 您必须自己创建编组器(来自单元REST.JsonReflect
)。 实施例:
var
Marshaler: TJSONMarshal;
JSONObject: TJSOnObject;
begin
Marshaler := TJSONMarshal.Create(TJSONConverter.Create);
try
Marshaler.RegisterJSONMarshalled(TYourClass, 'Field1');
Marshaler.DateFormat :=jdfUnix;
JSONObject := Marshaler.Marshal(AObject) as TJSOnObject;
Result := JSONObject;
finally
FreeAndNil(Marshaler);
end;
end;
要删除已覆盖的值,您可以调用UnregisterJSONMarshalled。
更新以阐明如何调用此方法:
declared方法签名是:
RegisterJSONMarshalled(clazz: TClass; Field: string; Marshal: Boolean);
因此传递三个参数:
Marshaler.RegisterJSONMarshalled(myclass.ClassType, Field, Marshal);
甚至更简单:
Marshaler.RegisterJSONMarshalled(TMyClass, Field, Marshal);
你必须传入你班级的班级类型。
答案 1 :(得分:0)
不,您无法在运行时更改属性。你必须找到一种不同的方法来处理编组的动态性质。