Почему TJson.ObjectToJsonObject/ObjectToJsonString представляет поля записи в виде массива JSON?

Существует несоответствие того, как 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;

ВЫХОД - это:

--- 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 ответ

Выход Delphi является допустимым JSON. Внутренне REST.TJson жестко запрограммирован для записи записи в виде массива JSON. Это просто, как это реализовано, это дизайн, а не ошибка. Это просто еще один способ представления данных. SuperObject выбирает быть более явным. Это тоже нормально. Две разные реализации, два разных представления. Спецификация JSON допускает и то и другое.

Другие вопросы по тегам