我有以下代码来序列化动态数组类。由于某种原因,SuperObject序列化私有变量而不是类属性名称。任何人都可以建议如何在SuperObject中修复此行为?
class function TJSON.AsJSON<T>(AObject: T; Indent: Boolean = False): string;
var
Ctx: TSuperRttiContext;
begin
Ctx := TSuperRttiContext.Create;
try
Result := Ctx.AsJson<T>(AObject).AsJSon(Indent);
finally
Ctx.Free;
end;
end;
type
TMyClass = class
private
FName_: String;
FAge_: Integer;
public
property Name: String read FName_ write FName_;
property Age: Integer read FAge_ write FAge_;
end;
procedure TFormTest.Button27Click(Sender: TObject);
var
MyClassArray: TArray<TMyClass>;
MyClass1, MyClass2: TMyClass;
begin
MyClass1 := TMyClass.Create;
MyClass1.Name := 'Joe';
MyClass1.Age := 10;
MyClass2 := TMyClass.Create;
MyClass2.Name := 'Dan';
MyClass2.Age := 13;
SetLength(MyClassArray, 2);
MyClassArray[0] := MyClass1;
MyClassArray[1] := MyClass2;
Memo1.Text := TJSON.AsJSON<TArray<TMyClass>>(MyClassArray);
end;
上面的代码生成以下JSON:
[{"FName_":"Joe","FAge_":10},{"FName_":"Dan","FAge_":13}]
我所追求的是以下JSON:
[{"Name":"Joe","Age":10},{"Name":"Dan","Age":13}]
答案 0 :(得分:1)
我认为目前这是不可能的,你可能会点击this issue
。即使是JSON编组的Delphi XE2 Datasnap serializes private
字段,在我看来,这只是在不考虑限制的情况下对新的扩展RTTI进行更深入的可见性的结果。
答案 1 :(得分:0)
据我所知,RTTI仅在published
属性上运行(我可能错了),但我认为您只需将属性访问级别切换为published
即可获得所需的JSON字符串