Delphi在运行时更改JSONMarshalledAttribute

时间:2017-07-24 13:59:04

标签: json delphi marshalling

我在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'的重载版本

我该如何解决这个问题?

2 个答案:

答案 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)

不,您无法在运行时更改属性。你必须找到一种不同的方法来处理编组的动态性质。