SuperObject сериализует приватные переменные вместо свойств

У меня есть следующий код, который сериализует динамический массив классов. По какой-то причине 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}]

2 ответа

Я думаю, что это не возможно в настоящее время, и что вы, вероятно, ударил this issue, Even Delphi XE2 Datasnap serializes private поля в JSON, и, на мой взгляд, это всего лишь следствие более глубокой видимости, предоставленной новым расширенным RTTI, без учета ограничений.

Насколько я знаю, RTTI работает только на published свойства (я могу ошибаться), но я думаю, что вы должны просто переключить уровень доступа к свойствам на published чтобы получить желаемую строку JSON.

Другие вопросы по тегам