我正在使用新的 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]
}
}
我的问题是:
- 有没有一种简单的方法来处理这个问题,而不必覆盖默认编组并创建自定义转换器/恢复器,以便 XE7 版本输出与 XE4 相同?
- 这值得在 Embarcadero Quality Central 上发布吗?
适用于 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