Delphi REST.JSON TJson.JsonToObject继承问题

时间:2019-07-08 08:27:56

标签: json delphi

我想使用REST.JSON Librairy将对象转换为JSON-String并返回,但是我遇到了一些问题。

比方说,我要转换的类是“ TFooChild1”和“ TFooChild2”,它们均源于“ TFoo”。 这些类如下所示:

TFoo = class
protected
  Name: string;
  Value: Double;
end;

TFooChild1 = class(TFoo)
private
  Limit: Double;
end;

TFooChild2 = class(TFoo)
private
  Limit: Double;
  WorkerID: Integer;
end;

创建并转换为JSON看起来像这样:

var
  Foo: TFoo;
  s: string;
begin
  Foo := TFooChild1.Create;
  Foo.Name:= '...';
  ... //assign all the Fields
  s := TJson.ObjectToJsonString(Foo);
  Foo.Free;

  //conversion to string is correct...

  Foo := TJson.JsonToObject<TFoo>(s, []);
  //Field "Limit" is lost
end

我知道这个(TJson.JsonToObject<TFoo>(s, []))永远不会返回类型TFooChild1,但这正是我所需要的。

当您转换回对象时,子类的字段会丢失。如何避免这种情况?我无法做JsonToObject<TFooChild1>,因为我不知道它将是Child1还是Child2。 有什么提示吗?

我已经在Google上搜索了是否可能包含类型信息的ConvertOption,但是我什么都没找到

1 个答案:

答案 0 :(得分:0)

将Rest.JsonReflect添加到您的uses类,因为您将需要使用附加到引用TFoo类的位置的[JsonReflect(ctObject,ctObject,TFooInterceptor)]属性。然后,您将必须编写一个TFooInterceptor对象来拦截和处理适当的转换。我将对ObjectReverterObjectConverter覆盖进行编码,然后从那里开始编码。您的TFooInterceptor应该从TJSONInterceptor继承。 REST.Json.Interceptors.pas源代码中有一些示例。