2015-04-24 1 views
3

Я пытался перевести мои объекты в строку json с TJson.ObjectToJsonString (object). Он отлично работает для простых объектов, но он сломается, если объект содержит массив (статический или динамический). Каков правильный способ создания json-строки объекта? Я посмотрел на TSuperObject, но не было видно, что мне нужно делать.Проблемы с преобразованием объектов delphi с массивами в json

структура класса

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 := '[email protected]'; 

    person.myArray[0] := true; 
    person.myArray[1] := false; 
    person.myArray[2] := true; 

    str := TJson.ObjectToJsonString(person);//Access Violation 

ответ

2

Вы можете убедить 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, не имеет лучшей репутации.