I am in the process of upgrading a project that was originally coded with Delphi XE4 using the new XE7 version. This application saves its main output as a marshaled JSON file that the users load, edit, save similar to what would be done with a Word document.
They do not work directly with the json, it is just used as the file format. The issue I am having is XE7 outputs the type TPointF differently than XE4 which causes an issue when trying to unmarshall.
This would not be an issue if I only had to handle opening files created with the new version but I have to support the old version files for at least a year. It looks like XE7 outputs all the possible fields in TPointF record (it is a variant record type)
Below is an example of the XE7 output
Using TJsonValue and TJsonMarshal:
{
  "type":"tstMnfHole.TmnfHole",
  "id":1,
  "fields":
  {
    "fctrPoint":
    [
      [0.625,132.5],
      0.625,
      132.5
    ]
  }
}
Using rest.json TJson.ObjectToJsonString(myHole)
{
  "ctrPoint":
  [
    [0.625,132.5],
    0.625,
    132.5
  ]
}
Below is an example of the XE4 output
Using TJsonValue and TJsonMarshal:
{
  "type":"tstMnfHole.TmnfHole",
  "id":1,
  "fields":
  {
    "fctrPoint":[0.625,132.5]
  }
}
My questions are:
- Is there a simple way to handle this with out having to override the default marshalling and create a custom converter/reverter so that the XE7 version outputs the same as XE4?
 - Is this worth posting on Embarcadero Quality Central?
 
small console test app for both XE4 and 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: replace system.json with data.dbxjson