3

我有以下代码可以序列化一个动态的类数组。出于某种原因,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}]
4

2 回答 2

1

我认为目前这是不可能的,而且你可能打了this issue. 即使是 JSON 编组中的 Delphi XE2 Datasnapserializes private字段,在我看来,这只是在不考虑限制的情况下为新的扩展 RTTI 提供了更深层次的可见性的结果。

于 2012-05-29T12:30:48.790 回答
0

据我所知,RTTI 只对published属性进行操作(我可能错了),但我认为您应该简单地将属性访问级别切换为published以获取所需的 JSON 字符串。

于 2012-05-29T09:37:47.240 回答