2017-07-24 71 views
2

我在Delphi中有一個類,我在jsonmarshalled文件中導出。Delphi在運行時更改JSONMarshalledAttribute

我跳過一些字段使用JSONMarshalledAttribute,駐留在單位:REST.JSON.Types。更多文獻here

[JSONMarshalledAttribute(False)]                                   
Field1: double;                                       
[JSONMarshalledAttribute(False)]                                   
Field2: double;                                       

到目前爲止,這項工作很好。

我的問題是:我可以在運行時將JSONMarshalledAttribute更改爲True嗎?

編輯1:

如這裏要求是代碼:

假設我們有一個窗體2: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;                                         

然後我n個實現:

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 Error] Unit2.pas(134): E2250 There is no overloaded version of >'RegisterJSONMarshalled' that can be called with these arguments

我該如何解決這個問題?

回答

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); 

你必須傳入你的類的類類型。

+0

這看起來像一個有趣的方法,我會給它一個鏡頭。謝謝 – Spymag

+0

嗨,我嘗試了一下,使其工作。我的課程源自TObject,RegisterJSONMarshallet需要一個TClass,我該如何處理? – Spymag

+0

據我所知,參數'TClass'指定你的類的名稱,你在那裏寫了'JSONMarshalledAttribute'到你的字段。只需使用classname作爲參數即可。 – ventiseis

0

不,您不能在運行時更改屬性。你必須找到一種不同的方法來處理編組的動態性。