2017-04-13 91 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)。 –