Почему 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 допускает и то и другое.