2017-04-13 121 views
1

我有一個對象如:德爾福TJson.ObjectToJsonString(TFoo):從JSON字符串

TFoo = class(TObject) 
    private 
    FConnection : TADOConnection; 
    public 
    FName : string; 
    FSurname : string; 
end; 

我轉換這個對象的JSON字符串ObjectToJsonString,例如:

uses REST.Json; 
// ... 
var 
    aFoo : TFoo; 
begin 
    aFoo := TFoo.create; 

    Memo1.lines.text := TJson.ObjectToJsonString(aFoo); 

    aFoo.free; 
end; 
排除私有變量

TJson.ObjectToJsonString使私有和公共變量json字符串。

我想從json字符串中排除一些像FConnection這樣的變量(它也公開連接字符串)。

任何建議只允許在公共變量上進行json轉換?

+0

我不認爲這是可能的。任何方式,如果你想隱藏你的連接字符串我建議你寧願去儲存前編碼它,然後加載時解碼它。 – SilverWarior

+0

相關:[德爾福Rest.JSON JsonToObject只適用於f變量](http://stackoverflow.com/questions/31778518/) –

回答

3

使用JSONMarshalled屬性:

屬性指定的字段或類型是否應被編組和解組。

如果JSONMarshalledAttribute不存在於某個字段或類型中,則應對該字段或類型進行編組和解組。如果JSONMarshalledAttribute存在但是False,則編組和解組過程跳過該字段或類型。

例如:

type 
    TFoo = class(TObject) 
    private 
    [JSONMarshalled(False)] 
    FConnection : TADOConnection; 

    public 
    FName : string; 
    FSurname : string; 
    end; 

也看一下JSONName屬性。默認情況下,如果字段名稱以F字符開頭,則編組會剝離生成的JSON數據中的F。在你上面的例子中,這很好,所以FNameFSurname編組爲NameSurname。但是,這可能並不總是可取的,這樣你就可以使用JSONName在JSON數據來指定自己的字段名稱,如:

type 
    TFoo = class(TObject) 
    private 
    [JSONMarshalled(False)] 
    FConnection : TADOConnection; 

    public 
    Name : string; 
    Surname : string; 

    [JSONName('FullName')] 
    FullName : string; 
    end; 
+0

我已添加'[JSONMarshalled(False)]',但'FConnection'總是在json字符串(我使用德爾福柏林Udate 2)。 – ar099968

+0

只是一個更新!雖然'Attribute'是實際類名的一部分,它在[代碼註釋中使用時是可選的](http),它可以工作,如果我使用'[JSONMarshalledAttribute(False)]'而不是'[JSONMarshalled(False)]' – ar099968

+1

@ ar099968 ://docwiki.embarcadero.com/RADStudio/en/Annotating_Types_and_Type_Members)。如果這不能正常工作,那是一個需要[向Embarcadero報告]的錯誤(http://quality.embarcadero.com)。 –