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单位的一个错误吗?
答案 0 :(得分:1)
Delphi输出是合法的JSON。在内部,REST.TJson
被硬编码为将记录编组为JSON数组。这就是它的实现方式,它是设计的,而不是一个bug。它只是表示数据的另一种方式。 SuperObject选择更明确。那也没关系。两种不同的实现,两种不同的表示。 JSON规范允许两者。