当我通过将目标平台更改为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;
知道解决方案是什么吗?请帮忙。
谢谢。/koul
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进行管理。托管类型不能出现在变体记录中。因此,该错误仅适用于移动编译器。
我相信superobject不支持移动编译器还有其他原因。因此,您需要使用x-superobject。
然而,正如我昨天在您之前的问题中所说,System.JSON
中的内置解析器完全能够解析您的JSON。你没有必要转换。