为什么TJson.ObjectToJsonObject / ObjectToJsonString将记录字段表示为JSON数组?

时间:2014-09-14 15:34:15

标签: json delphi records superobject delphi-xe7

SuperObject和TJson.ObjectToJsonObject如何表示类的某些部分(即记录字段)存在不一致。我们有以下代码段:

Uses rest.json, superobject;

  type

      TSimplePersonRec = record
        FirstName: string;
        LastName: string;
        Age: byte;
      end;

      TSimplePerson = class
        protected
          FPersonRec: TSimplePersonRec;
        public
          property personRecord: TSimplePersonRec read FPersonRec write FPersonRec;
      end;

    // ...

        { Public declarations }
        function toJson_SO(simplePerson: TSimplePerson): string;
        function toJson_Delphi(simplePerson: TSimplePerson): string;

    // ...

    function TForm1.toJson_Delphi(simplePerson: TSimplePerson): string;
    begin
      result := tjson.Format(TJson.ObjectToJsonObject(simplePerson));
    end;

    function TForm1.toJson_SO(simplePerson: TSimplePerson): string;
    var
      so: ISuperObject;
      ctx: TSuperRttiContext;
    begin
      ctx := TSuperRttiContext.Create;
      try
        so := ctx.AsJson<TSimplePerson>( simplePerson );
      finally
        ctx.Free;
      end;
      result := so.AsJSon(true, true);
    end;

    // ...

    procedure TForm1.Button3Click(Sender: TObject);
    var
      spr: TSimplePersonRec;
      sp: TSimplePerson;
    begin

      spr.FirstName := 'John';
      spr.LastName := 'Doe';
      spr.Age := 39;

      sp := TSimplePerson.Create;
      sp.personRecord := spr;

      memo1.Lines.Add(#13'--- SuperObject ---'#13);
      memo1.Lines.Add(toJson_SO(sp));
      memo1.Lines.Add(#13'---   Delphi    ---'#13);
      memo1.Lines.Add(toJson_Delphi(sp));
    end;

OUTPUT是:

--- SuperObject ---
{
 "FPersonRec": {
  "LastName": "Doe",
  "Age": 39,
  "FirstName": "John"
 }
}
---   Delphi    ---
{
  "personRec":
  [
    "John",
    "Doe",
    39
  ]
}

Delphi将记录表示为JSON数组的原因是什么?是否有公共标准或建议导致这种情况?

注意: 对我来说,使用{key:value}表示法而不是数组来表示记录更自然。在反序列化期间,不知道该值所属的女性的关键名称可能会产生奇怪的结果。例如,在反序列化期间,我可以传递一个具有相同布局的新类,其中包含具有不同内存布局的记录。在这种情况下,值将被随机分配或AV可能发生?

更新 我正在使用Delphi XE7。 我也发现了这个json.org:

  

JSON基于两种结构:

     
      
  • 名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控   列表或关联数组。
  •   
  • 有序的值列表。多数情况   语言,这被实现为数组,向量,列表或序列。
  •   

所以可能问题更多的是这是TJson单位的一个错误吗?

1 个答案:

答案 0 :(得分:1)

Delphi输出是合法的JSON。在内部,REST.TJson被硬编码为将记录编组为JSON数组。这就是它的实现方式,它是设计的,而不是一个bug。它只是表示数据的另一种方式。 SuperObject选择更明确。那也没关系。两种不同的实现,两种不同的表示。 JSON规范允许两者。