问题是Delphi XE4和XE7 JSON编组TPointF类型之间存在差异

时间:2014-11-19 16:35:08

标签: json delphi delphi-xe4 delphi-xe7

我正在使用新的XE7版本升级最初使用Delphi XE4编码的项目。此应用程序将其主输出保存为编组的JSON文件,用户可以加载,编辑,保存类似于Word文档的操作。

它们不直接与json一起工作,它只是用作文件格式。我遇到的问题是XE7输出的类型TPointF与XE4不同,这在尝试解组时会导致问题。

如果我只需要处理用新版本创建的打开文件,但是我必须支持旧版本文件至少一年,这不会是一个问题。看起来XE7输出TPointF记录中的所有可能字段(它是变体记录类型)

以下是 XE7输出

的示例

使用TJsonValueTJsonMarshal

{
  "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输出

的示例

使用TJsonValueTJsonMarshal

{
  "type":"tstMnfHole.TmnfHole",
  "id":1,
  "fields":
  {
    "fctrPoint":[0.625,132.5]
  }
}

我的问题是:

  1. 有没有一种简单的方法来处理这个问题而不必覆盖默认的编组并创建自定义转换器/恢复器,以便XE7版本输出与XE4相同的颜色?
  2. 这是否值得在Embarcadero Quality Central发布?
  3. 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

0 个答案:

没有答案