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

为什么TJson.ObjectToJsonObject/ObjectToJsonString将记录字段表示为JSON数组?,json,delphi,records,superobject,delphi-xe7,Json,Delphi,Records,Superobject,Delphi Xe7,SuperObject和TJson.ObjectToJsonObject表示类的某些部分(即记录字段)的方式不一致。让我们看一下下面的代码片段: Uses rest.json, superobject; type TSimplePersonRec = record FirstName: string; LastName: string; Age: byte; end; TSimplePerson = c

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;
Delphi将记录表示为JSON数组的原因是什么?是否有公共标准或建议导致这种情况

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

更新: 我使用的是DelphiXe7。 我在json.org上还发现了以下内容:

JSON构建在两种结构上:

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

因此,问题可能更多的是关于TJson单元中的错误吗?

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

TJson试图解决什么问题?它是否试图成为一个全面的JSON库?或者它只是想做任何需要它的事情?当然,你应该像其他人一样使用superobject always.json.org说:json构建在两个结构上:1)名称/值对的集合。在各种语言中,这是作为对象、记录、结构、字典、哈希表、键控列表或关联数组实现的。2) 值的有序列表。在大多数语言中,这是以数组、向量、列表或序列的形式实现的所以问题是这是TJSON单元中的一个bug吗?顺便说一句,是哪个版本的Delphi?我的版本是Delphi Xe7Test。我希望它也能表现得像超级对象一样。但很难回答真正的问题。如果输出本身没有错误,则可能是一个功能。如果它是一个bug,因为它是未记录的行为,那么自Delphi7以来添加的每个特性基本上都是一个bug有一天,有人可以邀请他的实现,其中一个整数字段被表示为一个包含5个元素的JSON数组,实际数字将存储在第3位。JSON规范也允许这样做,但它不可移植,而且很奇怪。将键/值对表示为有序值的数组是供应商发明的“协议”,而且不可移植,也很奇怪。就是。我更喜欢贴一个QC来增强:)
--- SuperObject ---
{
 "FPersonRec": {
  "LastName": "Doe",
  "Age": 39,
  "FirstName": "John"
 }
}
---   Delphi    ---
{
  "personRec":
  [
    "John",
    "Doe",
    39
  ]
}