无法将带有数组的delphi对象转换为json

时间:2015-04-24 16:45:12

标签: delphi delphi-xe6

我一直在尝试使用TJson.ObjectToJsonString(object)将我的对象转换为json字符串。它适用于简单对象,但如果对象包含数组(静态或动态),它将会中断。什么是创建对象的json字符串的正确方法?我看过TSuperObject,但我不需要做什么。

班级结构

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

1 个答案:

答案 0 :(得分:3)

您可以说服ObjectToJsonString处理数组,但它们需要是类型为info的数组。您的数组使用内联类型,但它们没有类型信息。

例如,声明字段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提供的图书馆并没有最好的声誉。