我正在使用新的XE7版本升级最初使用Delphi XE4编码的项目。此应用程序将其主输出保存为编组的JSON文件,用户可以加载,编辑,保存类似于Word文档的操作。
它们不直接与json一起工作,它只是用作文件格式。我遇到的问题是XE7输出的类型TPointF
与XE4不同,这在尝试解组时会导致问题。
如果我只需要处理用新版本创建的打开文件,但是我必须支持旧版本文件至少一年,这不会是一个问题。看起来XE7输出TPointF记录中的所有可能字段(它是变体记录类型)
以下是 XE7输出
的示例使用TJsonValue
和TJsonMarshal
:
{
"type":"tstMnfHole.TmnfHole",
"id":1,
"fields":
{
"fctrPoint":
[
[0.625,132.5],
0.625,
132.5
]
}
}
使用rest.json
TJson.ObjectToJsonString(myHole)
{
"ctrPoint":
[
[0.625,132.5],
0.625,
132.5
]
}
以下是 XE4输出
的示例使用TJsonValue
和TJsonMarshal
:
{
"type":"tstMnfHole.TmnfHole",
"id":1,
"fields":
{
"fctrPoint":[0.625,132.5]
}
}
我的问题是:
XE4和XE7的小型控制台测试应用程序。
XE7
program testPointf;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Types,
// rest.json,
data.dbxjsonReflect,
//data.dbxjson,
system.json,
tstMnfHole in 'tstMnfHole.pas';
var
myHole: TmnfHole;
valJson: TJSONValue;
Marshal: TJSONMarshal;
begin
try
{*** Create new test hole ***}
myHole := TmnfHole.Create(0.625, 132.5);
try
Marshal := TJSONMarshal.Create(TJSONConverter.Create);
try
valJson := Marshal.Marshal(myHole);
try
Writeln(valJson.ToString);
finally
valJson.Free;
end;
finally
Marshal.Free;
end;
finally
myHole.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
unit tstMnfHole;
interface
uses system.types;
type
TmnfHole = class(TObject)
//...
fctrPoint: TPointF;
constructor create; overload;
constructor create(thisCtrPoint: TPointF); overload;
constructor create(thisX, thisY: single); overload;
//...
end;
implementation
{ TmnfHole }
constructor TmnfHole.create;
begin
fctrPoint := TPointF.Create(0.75, 120.50);
end;
constructor TmnfHole.create(thisCtrPoint: TPointF);
begin
fctrPoint := TPointF.Create(thisCtrPoint.X, thisCtrPoint.Y);
end;
constructor TmnfHole.create(thisX, thisY: single);
begin
fctrPoint := TPointF.Create(thisX, thisY);
end;
end.
XE4
testPointf.dpr:将system.json
替换为data.dbxjson