【问题标题】:Trouble converting delphi objects with arrays to json将带有数组的delphi对象转换为json时遇到问题
【发布时间】:2015-07-03 09:16:23
【问题描述】:

我一直在尝试使用 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

【问题讨论】:

    标签: delphi delphi-xe6


    【解决方案1】:

    您可以说服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 提供的图书馆没有最好的声誉。

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多