Никто не сталкивался с сериализацией/Десериализацией произвольных объектов в JSON?
У меня был код который это делает, сегодня обнаружил, что в XE6u1 похоже ошибка.
При сериализации, спец символ "\" должен заменяться на "\\", но этого не происходит.
Код: unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DBXJSONReflect, System.JSON;
type
TTest = class
str: string;
end;
tJSONSerializator = class
public
class procedure Serialize(var SerializedData: string; pObj: tObject);
class procedure Deserialize(SerializedData: string; var pObj: Pointer);
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: tObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
class procedure tJSONSerializator.Serialize(var SerializedData: string; pObj: tObject);
var
JSONMarshal: TJSONMarshal;
JSONValue: TJSONValue;
UnformattedJSONString: string;
begin
try
// Инициализация
JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
// Сериализация объекта в строку
JSONValue := JSONMarshal.Marshal(pObj);
UnformattedJSONString := JSONValue.ToString;
SerializedData := UnformattedJSONString;
finally
// Выгрузка переменных
if Assigned(JSONValue) then
FreeAndNil(JSONValue);
if Assigned(JSONMarshal) then
FreeAndNil(JSONMarshal);
end;
end;
class procedure tJSONSerializator.Deserialize(SerializedData: string; var pObj: Pointer);
var
JSONUnMarshal: TJSONUnMarshal;
JSONValue: TJSONValue;
begin
try
// Инициализация
JSONUnMarshal := TJSONUnMarshal.Create();
// Десериализация объекта из строки
JSONValue := TJSONObject.ParseJSONValue(SerializedData);
pObj := JSONUnMarshal.Unmarshal(JSONValue);
finally
// Выгрузка переменных
if Assigned(JSONValue) then
FreeAndNil(JSONValue);
if Assigned(JSONUnMarshal) then
FreeAndNil(JSONUnMarshal);
end;
end;
procedure TForm1.FormCreate(Sender: tObject);
var
Test: TTest;
Serialized: string;
begin
Test := TTest.Create;
Test.str := 'C:\Program files (x86)\';
tJSONSerializator.Serialize(Serialized, Test);
if Pos('C:\Program files (x86)\', Serialized) <> 0 then
ShowMessage('Ваш Delphi работает не правильно, "\" должен экранироваться "\\", JSON имеет не корректную структуру.')
else if Pos('C:\\Program files (x86)\\', Serialized) <> 0 then
ShowMessage('Ваш Delphi работает правильно, "\" экранируется "\\".')
else
ShowMessage('Ваш Delphi вернул что-то неожиданное');
end;
end.
У меня был код который это делает, сегодня обнаружил, что в XE6u1 похоже ошибка.
При сериализации, спец символ "\" должен заменяться на "\\", но этого не происходит.
Код: unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DBXJSONReflect, System.JSON;
type
TTest = class
str: string;
end;
tJSONSerializator = class
public
class procedure Serialize(var SerializedData: string; pObj: tObject);
class procedure Deserialize(SerializedData: string; var pObj: Pointer);
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: tObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
class procedure tJSONSerializator.Serialize(var SerializedData: string; pObj: tObject);
var
JSONMarshal: TJSONMarshal;
JSONValue: TJSONValue;
UnformattedJSONString: string;
begin
try
// Инициализация
JSONMarshal := TJSONMarshal.Create(TJSONConverter.Create);
// Сериализация объекта в строку
JSONValue := JSONMarshal.Marshal(pObj);
UnformattedJSONString := JSONValue.ToString;
SerializedData := UnformattedJSONString;
finally
// Выгрузка переменных
if Assigned(JSONValue) then
FreeAndNil(JSONValue);
if Assigned(JSONMarshal) then
FreeAndNil(JSONMarshal);
end;
end;
class procedure tJSONSerializator.Deserialize(SerializedData: string; var pObj: Pointer);
var
JSONUnMarshal: TJSONUnMarshal;
JSONValue: TJSONValue;
begin
try
// Инициализация
JSONUnMarshal := TJSONUnMarshal.Create();
// Десериализация объекта из строки
JSONValue := TJSONObject.ParseJSONValue(SerializedData);
pObj := JSONUnMarshal.Unmarshal(JSONValue);
finally
// Выгрузка переменных
if Assigned(JSONValue) then
FreeAndNil(JSONValue);
if Assigned(JSONUnMarshal) then
FreeAndNil(JSONUnMarshal);
end;
end;
procedure TForm1.FormCreate(Sender: tObject);
var
Test: TTest;
Serialized: string;
begin
Test := TTest.Create;
Test.str := 'C:\Program files (x86)\';
tJSONSerializator.Serialize(Serialized, Test);
if Pos('C:\Program files (x86)\', Serialized) <> 0 then
ShowMessage('Ваш Delphi работает не правильно, "\" должен экранироваться "\\", JSON имеет не корректную структуру.')
else if Pos('C:\\Program files (x86)\\', Serialized) <> 0 then
ShowMessage('Ваш Delphi работает правильно, "\" экранируется "\\".')
else
ShowMessage('Ваш Delphi вернул что-то неожиданное');
end;
end.