0

当我通过将目标平台更改为 Android(SDK.22.3.32 位)来调试我的项目时出现以下错误

[DCC 错误] superobject.pas(601): E2154 类型 'TSuperTableString' 需要最终确定 - 不允许在变体记录中

以下代码在 Windows 中没有任何问题,但当我更改为 android 平台时:

procedure TForm1.Button1Click(Sender: TObject);
var jv: TJSONValue;
    jo: TJSONObject;
    jp: TJSONPair;
    ja: TJSONArray;
    i: integer;
    j: integer;
    strString,strValue,strArray:string;
begin

    ListBox1.Clear;


    RESTRequest1.Execute;

    jv:=RESTResponse1.JSONValue;


    jo:= TJSONObject.ParseJSONValue(jv.ToString) as TJSONObject;

    try
      for i := 0 to jo.Count - 1 do
      begin
        jp := jo.Pairs[i];

        if jp.JsonValue is TJSONArray then
        begin
            ja := jp.JsonValue as TJSONArray;
            for j := 0 to ja.Count -1 do
            begin
              PrintNamesAndValues(ja.Items[j].ToString);
            end;
        end;

      end;
    finally
      jo.Free;
    end;


end;

**

procedure TForm1.PrintNamesAndValues(prmJson:string);
var O:ISuperObject ;
    name,email,tod:string;
begin
    O := SO(prmJson);
    name := O.S['name'];
    tod := O.S['email'];

    ListBox1.Items.Add(name+'('+email+')');
end;

知道解决方案是什么吗?请帮忙。

谢谢。/库尔

4

1 回答 1

2

Superobject 不支持移动平台。你需要跨平台的 fork x-superobject:https ://code.google.com/p/x-superobject/

您报告的编译器错误是因为:

FO: record
  case TSuperType of
    stBoolean: (c_boolean: boolean);
    stDouble: (c_double: double);
    stCurrency: (c_currency: Currency);
    stInt: (c_int: SuperInt);
    stObject: (c_object: TSuperTableString);
    stArray: (c_array: TSuperArray);
{$IFDEF SUPER_METHOD}
    stMethod: (c_method: TSuperMethod);
{$ENDIF}
  end;
{.$ifend}

现在,TSuperTableString是一堂课。对于桌面编译器类是非托管的。对于移动编译器,类是托管类型,使用 ARC 进行管理。并且托管类型不能出现在变体记录中。因此,该错误仅适用于移动编译器。

我确信超级对象不支持移动编译器还有其他原因。因此,您需要改用 x-superobject。

但是,正如我昨天在您的上一个问题中所说,内置解析器System.JSON完全能够解析您的 JSON。您无需切换。

于 2015-02-13T12:59:57.590 回答