9

我们可以使用 SuperObject 库通过其名称调用某个对象的方法,并使用 SOInvoker 方法将其参数作为 json 字符串提供,如this answer

我想知道如何将创建的对象作为参数发送。我试着发送它

LObjectList := TObjectList.Create;
LSuperRttiCtx := TSuperRttiContext.Create;
LSuperObjectParameter := LObjectList.ToJson(LSuperRttiCtx);

SOInvoke(MyInstantiatedObject, 'MyMethod', LSuperObjectParameter);

但在 MyMethod 内部 LObjectList 引用丢失了。

我究竟做错了什么?

超级对象库可以在这里下载

4

1 回答 1

8

如果您使用记录数组而不是对象列表,它将起作用。如果您仍想使用对象列表,则必须像这样编写编码器和解码器。我已经为 TObjectList 编写了编码器/解码器,你必须为你的对象做同样的事情并将类名嵌入到某个地方。

ctx.SerialToJson.Add(TypeInfo(TObjectList), ObjectListToJSON);
ctx.SerialFromJson.Add(TypeInfo(TObjectList), JSONToObjectList);

function ObjectListToJSON(ctx: TSuperRttiContext; var value: TValue;
  const index: ISuperObject): ISuperObject;
var
  list: TObjectList;
  i: Integer;
begin
  list := TObjectList(value.AsObject);
  if list <> nil then
  begin
    Result := TSuperObject.Create(stArray);
    for i := 0 to list.Count - 1 do
      Result.AsArray.Add(encodeyourobject(list[i]));
  end else
    Result := nil;
end;

function JSONToObjectList(ctx: TSuperRttiContext; const obj: ISuperObject; var Value: TValue): Boolean;
var
  list: TObjectList;
  i: Integer;
begin
  list := nil;
  case ObjectGetType(obj) of
    stNull:
      begin
        Value := nil;
        Result := True;
      end;
    stArray:
      begin
        list := TObjectList.Create;
        for i := 0 to obj.AsArray.Length - 1 do
          list.Add(decodeyourobject(obj.AsArray[i]));
        Value := list;
        Result := True;
      end;
  else
      result := False;
  end;
end;
于 2012-01-06T15:12:04.650 回答