无法将带有数组的 delphi 个对象转换为 json
Trouble converting delphi objects with arrays to json
我一直在尝试将我的对象转换为带有 TJson.ObjectToJsonString(object) 的 json 字符串。它适用于简单的对象,但如果对象包含数组(静态或动态),它将中断。创建对象的 json 字符串的正确方法是什么?我查看了 TSuperObject,但不清楚我需要做什么。
Class结构
TPerson = class(TObject)
private
FID : integer;
FLastName : string;
FFirstName: string;
FEmail : string;
fMyArray : array[0..2] of boolean;
function ReadArray(i : integer):boolean;
procedure WriteArray(i : integer; val:boolean);
public
property ID : integer read FID write FID;
property LastName : string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email : string read FEmail write FEmail;
property MyArray[i : integer] :boolean read ReadArray write WriteArray;
end;
示例
person := TPerson.create();
person.ID := 25;
person.FirstName := 'Homer';
person.LastName := 'Bologna';
person.Email := 'Homer@Bologna.com';
person.myArray[0] := true;
person.myArray[1] := false;
person.myArray[2] := true;
str := TJson.ObjectToJsonString(person);//Access Violation
你可以说服ObjectToJsonString
处理数组,但它们需要是具有类型信息的数组。您的数组使用内联类型,但它们没有类型信息。
例如像这样声明字段fMyArray
:
type
TPerson = class(TObject)
private
type
TBooleanArray = array [0 .. 2] of Boolean;
private
FID: integer;
FLastName: string;
FFirstName: string;
FEmail: string;
fMyArray: TBooleanArray; // <-- this type has type info
function ReadArray(i: integer): Boolean;
procedure WriteArray(i: integer; val: Boolean);
public
property ID: integer read FID write FID;
property LastName: string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email: string read FEmail write FEmail;
property MyArray[i: integer]: Boolean read ReadArray write WriteArray;
end;
对 ObjectToJsonString
的调用产生了这个:
{"iD":0,"lastName":"","firstName":"","email":"","myArray":[false,false,false]}
同样,对于动态数组使用
fMyArray: TArray<Boolean>;
而不是
fMyArray: array of Boolean;
出于完全相同的原因。
您可能要考虑使用不同的 JSON 库。 Embarcadero 提供的图书馆没有最好的声誉。
我一直在尝试将我的对象转换为带有 TJson.ObjectToJsonString(object) 的 json 字符串。它适用于简单的对象,但如果对象包含数组(静态或动态),它将中断。创建对象的 json 字符串的正确方法是什么?我查看了 TSuperObject,但不清楚我需要做什么。
Class结构
TPerson = class(TObject)
private
FID : integer;
FLastName : string;
FFirstName: string;
FEmail : string;
fMyArray : array[0..2] of boolean;
function ReadArray(i : integer):boolean;
procedure WriteArray(i : integer; val:boolean);
public
property ID : integer read FID write FID;
property LastName : string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email : string read FEmail write FEmail;
property MyArray[i : integer] :boolean read ReadArray write WriteArray;
end;
示例
person := TPerson.create();
person.ID := 25;
person.FirstName := 'Homer';
person.LastName := 'Bologna';
person.Email := 'Homer@Bologna.com';
person.myArray[0] := true;
person.myArray[1] := false;
person.myArray[2] := true;
str := TJson.ObjectToJsonString(person);//Access Violation
你可以说服ObjectToJsonString
处理数组,但它们需要是具有类型信息的数组。您的数组使用内联类型,但它们没有类型信息。
例如像这样声明字段fMyArray
:
type
TPerson = class(TObject)
private
type
TBooleanArray = array [0 .. 2] of Boolean;
private
FID: integer;
FLastName: string;
FFirstName: string;
FEmail: string;
fMyArray: TBooleanArray; // <-- this type has type info
function ReadArray(i: integer): Boolean;
procedure WriteArray(i: integer; val: Boolean);
public
property ID: integer read FID write FID;
property LastName: string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email: string read FEmail write FEmail;
property MyArray[i: integer]: Boolean read ReadArray write WriteArray;
end;
对 ObjectToJsonString
的调用产生了这个:
{"iD":0,"lastName":"","firstName":"","email":"","myArray":[false,false,false]}
同样,对于动态数组使用
fMyArray: TArray<Boolean>;
而不是
fMyArray: array of Boolean;
出于完全相同的原因。
您可能要考虑使用不同的 JSON 库。 Embarcadero 提供的图书馆没有最好的声誉。